I want to compile a document that uses the tcolorbox package in two different ways:

  • with the option /tcb/lowerbox set to visible, so that the lower part of the tcolorbox environment is typeset
  • with the option /tcb/lowerbox set to ignored, so that the lower part of the tcolorbox environment is not used.

At the beginning of the document there is the command


which should be commented for the first case only.

Is it possible to control this behaviour from the command line when compiling the document, so that I do not have to edit the source explicitly in order to have the two versions of the document?

Here is a minimal working example. Let's say it is saved as test.tex.





  Upper part.
  Lower part.

  • 4
    pdflatex '\AtBeginDocument{\tcbset{lowerbox=visible}}\input{file}' might do. Can you add a short example to play with?
    – egreg
    Oct 22, 2013 at 22:45
  • @egreg Your suggestion works. Are you going to turn your comment into an answer?
    – Romildo
    Oct 23, 2013 at 1:10

2 Answers 2


You can add code to be executed when LaTeX scans \begin{document}. So long as \tcbset{lowerbox=ignored} is executed before \begin{document}, calling

pdflatex '\AtBeginDocument{\tcbset{lowerbox=visible}}\input{<filename>}'

for processing <filename>.tex should do. Read on if it doesn't.

Not every setting can be passed this way; for instance, if package foo.sty sets its options at \begin{document}, say calling \fooset{baz=true}, adding


to the command line would do nothing, because the order in which the calls are executed would be


which becomes

\fooset{baz=false}% <-- from the command line
\fooset{baz=true}% <-- from \usepackage{foo}

A way out is adding a layer, using \AtEndPreamble (requires \usepackage{etoolbox} in the document):

pdflatex '\AtEndPreamble{\AtBeginDocument{\fooset{baz=false}}}\input{<filename>}'
  • 1
    Usually I compile my documents with latexmk with the command latexmk -pvc -pdf <filename>. How can the method described in the answer be adapted to be used with latexmk, if possible at all?
    – Romildo
    Oct 23, 2013 at 8:14
  • The last command given in this answer does not work because of the requirement on the etoolbox package. How can this requirement be inserted in the given command?
    – Romildo
    Oct 23, 2013 at 12:01
  • You can add \RequirePackage{etoolbox} before \AtEndPreamble; for latexmk you have to use the -pdflatex="..." option, check the doc.
    – egreg
    Oct 23, 2013 at 12:04
  • Thanks for the solution. This is the full command I used with Miktex 2.9 on Windows OS: pdflatex --job-name=My_LaTeX_Filename_ArXiV "\RequirePackage{etoolbox}\AtEndPreamble{\AtBeginDocument{\pagestyle{fancy}}}\input{My_LaTeX_Filename}"
    – imriss
    Jan 12, 2015 at 19:36

You can avoid the \AtBeginDocument problems with this approach:


in the preamble. Then

pdflatex '\def\ignorelowerbox{true}\input{<filename>}'

if you want to ignore and

pdflatex '\input{<filename>}'

if not. This method is completely general (uses the e-TeX ifdefined for conciseness).

One could devise other schemes in this style unfortunately LaTeX has put the @ in quite a few useful things like \@namedef or \@firstoftwo hence this is more complicated as one would have to set the catcode etc... to use them.

  • and \csname ... \endcsname is too long to type in the command line.
    – user4686
    Oct 23, 2013 at 12:37

You must log in to answer this question.

Not the answer you're looking for? Browse other questions tagged .