有条件地设置命令,并将其用作长度(或其他参数)

有条件地设置命令,并将其用作长度(或其他参数)

我负责维护公司各种产品的用户手册,我想开始使用 LaTex。不同手册之间的许多内容是相同的,所以我希望能够标记我正在生成的文档 ID,这样就不会显示不同文档 ID 的文本。我决定使用包etoolbox,切换每个可能的文档编号,并只设置\toggletrue我正在生成的文档 ID。然后我可以使用\ifboolexprwith 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}

在此处输入图片描述

相关内容