% language=uk \startcomponent cld-gettingstarted \environment cld-environment \startchapter[title=Getting started] \startsection[title=Some basics] \index{processing} I assume that you have either the so called \CONTEXT\ standalone (formerly known as minimals) installed or \TEXLIVE. You only need \LUATEX\ and can forget about installing \PDFTEX\ or \XETEX, which saves you some megabytes and hassle. Now, from the users perspective a \CONTEXT\ run goes like: \starttyping context yourfile \stoptyping and by default a file with suffix \type {tex}, \type {mkvi} or \type {mkvi} will be processed. There are however a few other options: \starttyping context yourfile.xml context yourfile.rlx --forcexml context yourfile.lua context yourfile.pqr --forcelua context yourfile.cld context yourfile.xyz --forcecld context yourfile.mp context yourfile.xyz --forcemp \stoptyping When processing a \LUA\ file the given file is loaded and just processed. This options will seldom be used as it is way more efficient to let \type {mtxrun} process that file. However, the last two variants are what we will discuss here. The suffix \type {cld} is a shortcut for \CONTEXT\ \LUA\ Document. A simple \type {cld} file looks like this: \starttyping context.starttext() context.chapter("Hello There!") context.stoptext() \stoptyping So yes, you need to know the \CONTEXT\ commands in order to use this mechanism. In spite of what you might expect, the codebase involved in this interface is not that large. If you know \CONTEXT, and if you know how to call commands, you basically can use this \LUA\ method. The examples that I will give are either (sort of) standalone, i.e.\ they are dealt with from \LUA, or they are run within this document. Therefore you will see two patterns. If you want to make your own documentation, then you can use this variant: \starttyping \startbuffer context("See this!") \stopbuffer \typebuffer \ctxluabuffer \stoptyping I use anonymous buffers here but you can also use named ones. The other variant is: \starttyping \startluacode context("See this!") \stopluacode \stoptyping This will process the code directly. Of course we could have encoded this document completely in \LUA\ but that is not much fun for a manual. \stopsection \startsection[title=The main command] There are a few rules that you need to be aware of. First of all no syntax checking is done. Second you need to know what the given commands expects in terms of arguments. Third, the type of your arguments matters: \starttabulate[|||] \NC \type{nothing} \EQ just the command, no arguments \NC \NR \NC \type{string} \EQ an argument with curly braces \NC \NR \NC \type{array} \EQ a list between square backets (sometimes optional) \NC \NR \NC \type{hash} \EQ an assignment list between square brackets \NC \NR \NC \type{boolean} \EQ when \type {true} a newline is inserted \NC \NR \NC \EQ when \type {false}, omit braces for the next argument \NC \NR \stoptabulate In the code above you have seen examples of this but here are some more: \starttyping context.chapter("Some title") context.chapter({ "first" }, "Some title") context.startchapter({ title = "Some title", label = "first" }) \stoptyping This blob of code is equivalent to: \starttyping \chapter{Some title} \chapter[first]{Some title} \startchapter[title={Some title},label=first] \stoptyping You can simplify the third line of the \LUA\ code to: \starttyping context.startchapter { title = "Some title", label = "first" } \stoptyping In case you wonder what the distinction is between square brackets and curly braces: the first category of arguments concerns settings or lists of options or names of instances while the second category normally concerns some text to be typeset. Strings are interpreted as \TEX\ input, so: \starttyping context.mathematics("\\sqrt{2^3}") \stoptyping and if you don't want to escape: \starttyping context.mathematics([[\sqrt{2^3}]]) \stoptyping are both correct. As \TEX\ math is a language in its own and a de-facto standard way of inputting math this is quite natural, even at the \LUA\ end. \stopsection \startsection[title=Spaces and Lines] \index{spaces} \index{lines} In a regular \TEX\ file, spaces and newline characters are collapsed into one space. At the \LUA\ end the same happens. Compare the following examples. First we omit spaces: \startbuffer context("left") context("middle") context("right") \stopbuffer \typebuffer \ctxluabuffer Next we add spaces: \startbuffer context("left") context(" middle ") context("right") \stopbuffer \typebuffer \ctxluabuffer We can also add more spaces: \startbuffer context("left ") context(" middle ") context(" right") \stopbuffer \typebuffer \ctxluabuffer In principle all content becomes a stream and after that the \TEX\ parser will do its normal work: collapse spaces unless configured to do otherwise. Now take the following code: \startbuffer context("before") context("word 1") context("word 2") context("word 3") context("after") \stopbuffer \typebuffer \ctxluabuffer Here we get no spaces between the words at all, which is what we expect. So, how do we get lines (or paragraphs)? \startbuffer context("before") context.startlines() context("line 1") context("line 2") context("line 3") context.stoplines() context("after") \stopbuffer \typebuffer \ctxluabuffer This does not work out well, as again there are no lines seen at the \TEX\ end. Newline tokens are injected by passing \type {true} to the \type {context} command: \startbuffer context("before") context.startlines() context("line 1") context(true) context("line 2") context(true) context("line 3") context(true) context.stoplines() context("after") \stopbuffer \typebuffer \ctxluabuffer Don't confuse this with: \startbuffer context("before") context.par() context("line 1") context.par() context("line 2") context.par() context("line 3") context.par() context("after") context.par() \stopbuffer \typebuffer \ctxluabuffer There we use the regular \type {\par} command to finish the current paragraph and normally you will use that method. In that case, when set, whitespace will be added between paragraphs. This newline issue is a somewhat unfortunate inheritance of traditional \TEX, where \type {\n} and \type {\r} mean something different. I'm still not sure if the \CLD\ do the right thing as dealing with these tokens also depends on the intended effect. Catcodes as well as the \LUATEX\ input parser also play a role. Anyway, the following also works: \startbuffer context.startlines() context("line 1\n") context("line 2\n") context("line 3\n") context.stoplines() \stopbuffer \typebuffer \stopsection \startsection[title=Direct output] \index{direct output} \index{verbose} The \CONTEXT\ user interface is rather consistent and the use of special input syntaxes is discouraged. Therefore, the \LUA\ interface using tables and strings works quite well. However, imagine that you need to support some weird macro (or a primitive) that does not expect its argument between curly braces or brackets. The way out is to precede an argument by another one with the value \type {false}. We call this the direct interface. This is demonstrated in the following example. \startbuffer \unexpanded\def\bla#1{[#1]} \startluacode context.bla(false,"***") context.par() context.bla("***") \stopluacode \stopbuffer \typebuffer This results in: \getbuffer Here, the first call results in three \type {*} being passed, and \type {#1} picks up the first token. The second call to \type {bla} gets \type {{***}} passed so here \type {#1} gets the triplet. In practice you will seldom need the direct interface. In \CONTEXT\ for historical reasons, combinations accept the following syntax: \starttyping \startcombination % optional specification, like [2*3] {\framed{content one}} {caption one} {\framed{content two}} {caption two} \stopcombination \stoptyping You can also say: \starttyping \startcombination \combination {\framed{content one}} {caption one} \combination {\framed{content two}} {caption two} \stopcombination \stoptyping When coded in \LUA, we can feed the first variant as follows: \startbuffer context.startcombination() context.direct("one","two") context.direct("one","two") context.stopcombination() \stopbuffer \typebuffer To give you an idea what this looks like, we render it: \startlinecorrection[blank] \ctxluabuffer \stoplinecorrection So, the \type {direct} function is basically a no|-|op and results in nothing by itself. Only arguments are passed. An equivalent but bit more ugly looking is: \starttyping context.startcombination() context(false,"one","two") context(false,"one","two") context.stopcombination() \stoptyping \stopsection \startsection[title=Catcodes] \index{catcodes} If you are familiar with the inner working of \TEX, you will know that characters can have special meanings. This meaning is determined by their catcodes. \startbuffer context("$x=1$") \stopbuffer \typebuffer This gives: \ctxluabuffer\ because the dollar tokens trigger inline math mode. If you think that this is annoying, you can do the following: \startbuffer context.pushcatcodes("text") context("$x=1$") context.popcatcodes() \stopbuffer \typebuffer Now we get: \ctxluabuffer. There are several catcode regimes of which only a few make sense in the perspective of the cld interface. \starttabulate[|Tl|l|] \NC ctx, ctxcatcodes, context \NC the normal \CONTEXT\ catcode regime \NC \NR \NC prt, prtcatcodes, protect \NC the \CONTEXT\ protected regime, used for modules \NC \NR \NC tex, texcatcodes, plain \NC the traditional (plain) \TEX\ regime \NC \NR \NC txt, txtcatcodes, text \NC the \CONTEXT\ regime but with less special characters \NC \NR \NC vrb, vrbcatcodes, verbatim \NC a regime specially meant for verbatim \NC \NR \NC xml, xmlcatcodes \NC a regime specially meant for \XML\ processing \NC \NR \stoptabulate In the second case you can still get math: \starttyping context.pushcatcodes("text") context.mathematics("x=1") context.popcatcodes() \stoptyping When entering a lot of math you can also consider this: \starttyping context.startimath() context("x") context("=") context("1") context.stopimath() \stoptyping Module writers of course can use \type {unprotect} and \type {protect} as they do at the \TEX\ end. As we've seen, a function call to \type {context} acts like a print, as in: \startbuffer context("test ") context.bold("me") context(" first") \stopbuffer \typebuffer \ctxluabuffer When more than one argument is given, the first argument is considered a format conforming the \type {string.format} function. \startbuffer context.startimath() context("%s = %0.5f",utf.char(0x03C0),math.pi) context.stopimath() \stopbuffer \typebuffer \ctxluabuffer This means that when you say: \starttyping context(a,b,c,d,e,f) \stoptyping the variables \type {b} till \type {f} are passed to the format and when the format does not use them, they will not end up in your output. \starttyping context("%s %s %s",1,2,3) context(1,2,3) \stoptyping The first line results in the three numbers being typeset, but in the second case only the number~1 is typeset. \stopsection \stopchapter \stopcomponent