从命令行设置包选项

从命令行设置包选项

我想编写一份使用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 等......才能使用它们。

相关内容