
Das folgende Minibeispiel wird nicht kompiliert:
\starttext
\doifundefined{undefined}{%
\startxtable
\startxtablebody
\startxrow
\startxcell cell \stopxcell
\stopxrow
\stopxtablebody
\stopxtable}
\stoptext
Das ist, was ich bekomme:
lcc@home:tex> context --batchmode xtable2.tex
resolvers | trees | analyzing '/Users/lcc/Library/texlive/texmf-config'
resolvers | trees | analyzing '/Users/lcc/Library/texlive/texmf'
mtx-context | run 1: luatex --fmt="/Users/lcc/Library/texlive/texmf-var/luatex-cache/context/a86c089b384a3076dc514ba966a1fac9/formats/luatex/cont-en" --interaction="batchmode" --jobname="xtable2" --lua="/Users/lcc/Library/texlive/texmf-var/luatex-cache/context/a86c089b384a3076dc514ba966a1fac9/formats/luatex/cont-en.lui" --no-parse-first-line --c:batchmode --c:currentrun=1 --c:fulljobname="./xtable2.tex" --c:input="./xtable2.tex" --c:kindofrun=1 --c:maxnofruns=9 "cont-yes.mkiv"
This is LuaTeX, Version 0.95.0 (TeX Live 2016)
system commands enabled.
resolvers > trees > analyzing '/Users/lcc/Library/texlive/texmf-config'
resolvers > trees > analyzing '/Users/lcc/Library/texlive/texmf'
open source > 1 > 1 > /usr/local/texlive/current/texmf-dist/tex/context/base/mkiv/cont-yes.mkiv
system > 'cont-new.mkiv' loaded
open source > 2 > 2 > /usr/local/texlive/current/texmf-dist/tex/context/base/mkiv/cont-new.mkiv
close source > 2 > 2 > /usr/local/texlive/current/texmf-dist/tex/context/base/mkiv/cont-new.mkiv
system > files > jobname 'xtable2', input './xtable2', result 'xtable2'
fonts > latin modern fonts are not preloaded
languages > language 'en' is active
open source > 2 > 3 > /Users/lcc/Projects/inactive/MVNECO/tex/xtable2.tex
close source > 2 > 3 > /Users/lcc/Projects/inactive/MVNECO/tex/xtable2.tex
close source > 1 > 3 > /usr/local/texlive/current/texmf-dist/tex/context/base/mkiv/cont-yes.mkiv
tex error > tex error on line 0 in file : ! Emergency stop
<empty file>
mtx-context | fatal error: return code: 1
Das gleiche Dokument ohne \doifundefined
lässt sich problemlos kompilieren und liefert die gewünschte Ausgabe. Was kann ich tun, um eine Xtable bedingt zu setzen?
Ich verwende die neueste ConTeXt-Distribution, die mit Texlive 2016 geliefert wird.
Antwort1
xtables sind Puffer: wenn Sie xtables einbetten möchten, verwenden Sie \startembeddedxtable
stattdessen \startxtable
:
\starttext
\doifundefined{undefined}{%
\startembeddedxtable
\startxtablebody
\startxrow
\startxcell cell \stopxcell
\stopxrow
\stopxtablebody
\stopembeddedxtable
}
\stoptext
Eine andere Möglichkeit besteht darin, einen Modus festzulegen, wenn ein Befehl nicht definiert ist, und den Inhalt entsprechend diesem Modus zu verarbeiten:
\starttext
\doifundefined{undefined}{\enablemode[alltables]}
\startmode[alltables]
\startxtable
\startxtablebody
\startxrow
\startxcell cell \stopxcell
\stopxrow
\stopxtablebody
\stopxtable
\stopmode
\stoptext
oder den Inhalt der Tabelle zunächst in einem Puffer zu speichern und diesen dann zu verarbeiten, wenn die Variable undefiniert ist:
\starttext
\startbuffer[content]
\startxtable
\startxtablebody
\startxrow
\startxcell cell \stopxcell
\stopxrow
\stopxtablebody
\stopxtable
\stopbuffer
\doifundefined{undefined}{\getbuffer[content]}
\stoptext
(Hans Hagen)