我负责维护公司各种产品的用户手册,我想开始使用 LaTex。不同手册之间的许多内容是相同的,所以我希望能够标记我正在生成的文档 ID,这样就不会显示不同文档 ID 的文本。我决定使用包etoolbox
,切换每个可能的文档编号,并只设置\toggletrue
我正在生成的文档 ID。然后我可以使用\ifboolexpr
with or
,这是必要的,因为许多东西可以在不同的文档 ID 之间共享。
示例 1
我确定的方法适用于文本块(您可以看到\widthB
从我的第一个示例中的第 17 行开始显示,没有问题)。并且从命令中设置长度也可以正常工作,如示例 1 所示。但是当我想根据文档 ID 定义一个参数并将该参数提供给命令时,它不起作用。您可以通过修改示例 1 来确认这一点,以便第 21 行使用\widthB
而不是\widthA
。
\documentclass{minimal}
\usepackage{etoolbox}
\newtoggle{Doc1A}
\newtoggle{Doc2A}
\newtoggle{Doc1B}
\newtoggle{Doc2B}
\toggletrue{Doc1A}
\begin{document}
\newcommand{\widthA}{2in}
widthA \widthA
\newcommand{\widthB}{\ifboolexpr{ togl {Doc1A} or togl {Doc1B} }{3.3in}{4.3in}}
widthB \widthB
\newdimen\mylength
\setlength{\mylength}{\widthA}
mylength \the\mylength
\framebox[\mylength]{example text}
\end{document}
示例 2
这个例子表明确实可以使用条件,但我发现这种方法非常笨重和低效,我真的不认为它适用于这个项目。
\documentclass{minimal}
\newif\ifDocOneA
\newif\ifDocTwoA
\newif\ifDocOneB
\newif\ifDocTwoB
\DocOneAtrue
\DocTwoAfalse
\DocOneBfalse
\DocTwoBfalse
\begin{document}
\newcommand{\widthC}{\ifnum
\ifDocOneA 1
\else
\ifDocOneB 1
\else 0
\fi
\fi
>0
3.3in
\else
4.3in
\fi}
widthC \widthC
\newdimen\mylength
\setlength{\mylength}{\widthC}
mylength \the\mylength
\framebox[\mylength]{example text}
\end{document}
知道为什么示例 1 中的条件不起作用吗?
答案1
您必须使用“可扩展”版本\ifboolexpr
,即\ifboolexpe
。我使用了不同的长度,以便更清楚地看到选择了所需的长度。
\documentclass{article}
\usepackage{etoolbox}
\newtoggle{Doc1A}
\newtoggle{Doc2A}
\newtoggle{Doc1B}
\newtoggle{Doc2B}
\toggletrue{Doc1A}
\begin{document}
\newcommand{\widthA}{100pt}
widthA \widthA
\newcommand{\widthB}{\ifboolexpe{ togl {Doc1A} or togl {Doc1B} }{200pt}{300pt}}
widthB \widthB
\newdimen\mylength
\setlength{\mylength}{\widthB}
mylength \the\mylength
\framebox[\mylength]{example text}
\end{document}