我想编写一份使用tcolorbox
两种不同的包装方式:
- 将选项
/tcb/lowerbox
设置为visible
,以便环境的下半部tcolorbox
分排版 - 将选项
/tcb/lowerbox
设置为ignored
,这样环境的下半部分tcolorbox
就不会被使用。
在文档的开头有命令
\tcbset{lowerbox=ignored}
仅应对第一种情况进行评论。
编译文档时是否可以从命令行控制此行为,以便我不必明确编辑源代码即可获得文档的两个版本?
这是一个最小的工作示例。假设它保存为test.tex
。
\documentclass{standalone}
\usepackage{tcolorbox}
%\tcbset{lowerbox=ignored}
\begin{document}
\begin{tcolorbox}
Upper part.
\tcblower
Lower part.
\end{tcolorbox}
\end{document}
答案1
您可以添加在 LaTeX 扫描时执行的代码\begin{document}
。只要\tcbset{lowerbox=ignored}
在之前执行\begin{document}
,调用
pdflatex '\AtBeginDocument{\tcbset{lowerbox=visible}}\input{<filename>}'
处理<filename>.tex
应该可以。如果不行的话请继续阅读。
并非所有设置都可以通过这种方式传递;例如,如果包foo.sty
在 设置其选项\begin{document}
,比如调用\fooset{baz=true}
、添加
\AtBeginDocument{\fooset{baz=false}}
命令行不会执行任何操作,因为执行调用的顺序是
\AtBeginDocument{\fooset{baz=false}}
...
\usepackage{foo}
变成
\fooset{baz=false}% <-- from the command line
\fooset{baz=true}% <-- from \usepackage{foo}
一个解决方法是添加一个层,使用\AtEndPreamble
(\usepackage{etoolbox}
文档中需要):
pdflatex '\AtEndPreamble{\AtBeginDocument{\fooset{baz=false}}}\input{<filename>}'
答案2
您可以\AtBeginDocument
使用此方法避免这些问题:
\ifdefined\ignorelowerbox\tcbset{lowerbox=ignored}\fi
在序言中。然后
pdflatex '\def\ignorelowerbox{true}\input{<filename>}'
如果你想忽略
pdflatex '\input{<filename>}'
如果不是的话。此方法完全通用(e-TeX
ifdefined
为了简洁起见使用了)。
@
人们可以设计出这种风格的其他方案,不幸的是,LaTeX 已经在很多有用的东西中加入了一些\@namedef
,\@firstoftwo
因此这更为复杂,因为人们必须设置 catcode 等......才能使用它们。