假设我有一个 .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
和环境 - 该包将写入文件,然后将其包含在文档末尾。shortsolution
answers
shortsolution
shortsolutions.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 维基更多细节。