条件排版/构建

条件排版/构建

假设我有一个 .tex 文件,它是一组问题和解决方案,我想将其制作成两个 pdf 文件,一个包含解决方案,一个不包含。所以我需要在两种不同的模式下构建 .tex 文件,并指定在其中一种模式下忽略文档的某些部分。

这在编程环境中很常见。例如,在C++“我可以编码”中

#ifdef DEBUG
  // do this additional stuff ...
#endif

我怎样才能在乳胶中做一些等效的事情?

答案1

正如我在这里提到的,最简单的方法可能是条件:

\newif\ifanswers
\answerstrue % comment out to hide answers
\documentclass{article}
\begin{document}
Question
\ifanswers
Answer
\fi
\end{document}

答案2

有很多方法可以做到这一点。

一种方法是使用\ifdefined

\documentclass{article}
%\newcommand*{\DEBUG}{}%
\begin{document}
\ifdefined\DEBUG
    DEBUG was on
\else
   DEBUG was off
\fi
\end{document}

另一种方法是使用\newtoggle包裹etoolbox

\documentclass{article}
\usepackage{etoolbox}

\newtoggle{DEBUG}
\toggletrue{DEBUG}
%\togglefalse{DEBUG}

\begin{document}
\iftoggle{DEBUG}{
    DEBUG was on
}{
   DEBUG was off
}
\end{document}

相同的包还提供了newbool类似的功能:

\documentclass{article}
\usepackage{etoolbox}

\newbool{DEBUG}
\booltrue{DEBUG}
%\boolfalse{DEBUG}

\begin{document}
\ifbool{DEBUG}{
    DEBUG was on
}{
   DEBUG was off
}
\end{document}

etoolbox 包中的 \newbool 和 \newtoggle 之间的区别对这两者进行讨论。


另一种方法是使用包裹xstring

\documentclass{article}
\usepackage{xstring}

\newcommand{\DEBUG}{ON}%

\begin{document}
\IfStrEq{\DEBUG}{ON}{
    DEBUG was on
}{
    DEBUG was off
}
\end{document}

或者使用包裹ifthen。但请记下为什么 ifthen 包已经过时了?如果考虑这个解决方案。

\documentclass{article}
\usepackage{xifthen}

\newcommand{\DEBUG}{ON}%

\begin{document}
\ifthenelse{\equal{\DEBUG}{ON}}{
    DEBUG was on
}{
    DEBUG was off
}
\end{document}

随着时间的推移,我已经使用了所有的选项(并且xifthen由于链接中关于这个包已经过时的评论而远离它),但是\ifdefined在进行快速测试时倾向于使用这种方法,并且使用etoolbox方法为开/关条件提供更长期的解决方案,以及xstring在有更多条件需要考虑时使用这种方法。

正如@Seamus提到的那样,有一个\newif内置的,但我倾向于避免使用它,因为我不喜欢语法并且每次都必须查找它,但这只是个人喜好

答案3

其他答案针对的是一般情况。关于您描述的想要排版“问题和答案”的具体问题,您可能想考虑使用可以answers为您完成所有艰苦工作的软件包。

平均能量损失

我在下面设置了一个problem和环境 - 该包将写入文件,然后将其包含在文档末尾。shortsolutionanswersshortsolutionshortsolutions.tex

\documentclass{article}
\usepackage{answers} 
%\usepackage[nosolutionfiles]{answers}        % use this line if you want to see the answers 
                                                                                        % in the document

\newcounter{problem}
\newenvironment{problem}{\refstepcounter{problem} {\bfseries\theproblem}.\ }{}
% solution files
\Opensolutionfile{shortsolutions}
\Newassociation{shortsolution}{shortSoln}{shortsolutions}

\begin{document}

\begin{problem}
Here's a question
     \begin{shortsolution}
      Here's the answer- can put anything in here: e.g $\frac{1}{3}$
     \end{shortsolution}
\end{problem}

\begin{problem}
Here's another question
     \begin{shortsolution}
      Here's another answer- can put figures, tables- anything you like!
     \end{shortsolution}
\end{problem}
\newpage

% close the solutions files
\Closesolutionfile{shortsolutions}

% input the SHORT solutions file
\IfFileExists{shortsolutions.tex}{\input{shortsolutions.tex}}{}

\end{document}

如果你切换线路

%\usepackage{answers} 
\usepackage[nosolutionfiles]{answers}        % use this line if you want to see the answers 

然后答案将与问题一起显示。

截屏

答案4

在 ConTeXt 中,您可以使用modes条件排版。可以在命令行中设置模式,方法是传递

context --modes=<list of modes>

或使用\enablemode和。您可以使用或 使用或 来\disablemode测试是否设置了模式。\doifmodeelse{...}{...}{...}\startmode\startnotmode

查看ConTeXt 维基更多细节。

相关内容