我创建了一个 if true/false语句\newif\ifdetail
,希望可以在\begin{align}...\end{align}
环境中使用它。目标是,我将旧的手写推导转换为 tex,并希望能够翻转宏以显示或隐藏推导的所有中间步骤(例如,隐藏正文中的详细信息,并通过在不同的文件中更改 true/false 声明,或在将详细信息放入附录时等,将所有详细信息放入附录中)。
我到目前为止的尝试都失败了(见下文)。有没有人有这种设置的有效解决方案?对于多线方程,使用align
和/或是必不可少的。eqnarray
当我尝试让它在内部工作时align
,我可以让错误或正确的版本工作(通过{}
在前一种情况下用包装条件,但不能同时进行两者。它似乎align
正在做一些与这种简单相冲突的事情,\newif
因为它会导致编译错误。我有两个最小工作示例(MWE)来演示这两种情况。
% This MWE compiles
% true: compiles
% false: fails
\documentclass{article}
\usepackage{amsmath}
% new if true/false
\newif\ifdetail
% set it to true, this works
%\let\ifdetail\iftrue
% set it to false, this fails
\let\ifdetail\iffalse
\begin{document}
\begin{align}
a &=b
\ifdetail
\nonumber\\&=
\textrm{intermediate step}
\fi
\nonumber\\&=
\textrm{final answer}
\end{align}
\end{document}
% This MWE compiles - notice the extra {} surrounding the {\ifdetail...\fi}
% true: fails
% false: compiles
\documentclass{article}
\usepackage{amsmath}
% new if true/false
\newif\ifdetail
% set it to true, this works
\let\ifdetail\iftrue
% set it to false, this fails
%\let\ifdetail\iffalse
\begin{document}
\begin{align}
a &=b
{\ifdetail
\nonumber\\&=
\textrm{intermediate step}
\fi}
\nonumber\\&=
\textrm{final answer}
\end{align}
\end{document}
答案1
我必须将条件代码align
保存在一个组(参数)中以将其隐藏,直到最后一分钟。
因此,在块中,我使用条件代码作为参数align
调用了(关键:在括号中)。然后执行测试,但仍然通过调用仅对true 的调用来屏蔽参数,然后通过参数的方式调用 (同样,在括号中)。\testifdetail
\testifdetail
\if
\testifdetailaux
\ifdetail
最后,清除align
搜索逻辑,\testifdetailaux
能够将结果直接吐出到align
块中。
% This MWE compiles
% true: compiles
% false: fails
\documentclass{article}
\usepackage{amsmath}
% new if true/false
\newif\ifdetail
% set it to true, this works
\detailtrue
% set it to false, this fails
%\detailfalse
\newcommand\testifdetail[1]{\ifdetail\testifdetailaux{#1}\fi}
\newcommand\testifdetailaux[1]{#1}
\begin{document}
\begin{align}
a &=b
\testifdetail
{\nonumber\\&=
\textrm{intermediate step}
}
\nonumber\\&=
\textrm{final answer}
\end{align}
\detailfalse
\begin{align}
a &=b
\testifdetail
{\nonumber\\&=
\textrm{intermediate step}
}
\nonumber\\&=
\textrm{final answer}
\end{align}
\end{document}
答案2
这和换行符的位置有关。此外,这不是一个align
特定的问题:如果您直接使用 执行类似版本的代码tabular
,您会收到完全相同的错误消息。但如果您像我一样移动换行符,那就没问题了。
以下代码对\detailtrue
和都有效\detailfalse
;我所做的就是移动\nonumber\\
。
\documentclass{article}
\usepackage{amsmath}
% new if true/false
\newif\ifdetail
\detailtrue
\begin{document}
\begin{align}
a &=b \nonumber \\
\ifdetail
&=
\textrm{intermediate step} \nonumber\\
\fi
&=
\textrm{final answer}
\end{align}
\end{document}
为了更聪明的巫师的利益:与 OP 报告的相同问题出现在
\documentclass{article}
\newif\ifdetails
\detailstrue
\begin{document}
\begin{tabular}{cc}
a & 1
\ifdetails
\\ b & 2 \\
c & 3 \\
d & 4
\fi
\\ e & 5
\end{tabular}
\end{document}
但一切都很好
\documentclass{article}
\newif\ifdetails
\detailsfalse
\begin{document}
\begin{tabular}{cc}
a & 1 \\
\ifdetails
b & 2 \\
c & 3 \\
d & 4 \\
\fi
e & 5
\end{tabular}
\end{document}
答案3
当条件(在您的示例中)在第一个不可扩展标记之后的项目\ifdetails
内部开始时,随后的标记将被放入输入队列,直到或(在 LaTeX 中是)发生。然后输入队列紧接着是列声明数据的第二部分,该部分由其最终确定,并且无法按对跳过,因此会出现错误。这是您的示例,可以通过此示例简化:\halign
&
\cr
\\
\endtemplate
\if...\fi
\halign{x#y\cr
a\iffalse b \cr
c\fi \cr
}
这里\iffalse
跳过了 b 但随后\cr
被列数据的第二部分(即)替换,y
后面跟着\endtemplate
,所以出现错误。
Steven Segletes 展示的工作示例基于这样的事实:他的条件语句从模板的开头开始(在此状态下,空格被忽略,标记被扩展,因为 TeX 试图找到原始符号\omit
)。在此状态下,和&
不会\cr
被列数据的第二部分替换。因此,它们可以被条件语句跳过。该示例可以通过以下方式简化:
\halign{x#y\cr
\iffalse b \cr
\fi c \cr
}
跳过部分表格数据的通用原则基于以下事实:如果在括号内处理, TeX 允许将\cr
或读入宏参数(而不将其替换为列数据的第二部分)。实现此功能是因为 TeX 允许在 中执行此操作。这意味着它可以工作:&
\matrix{}
\matrix{}
\def\ignore#1{}
\halign{x#y\cr
a\ignore{ b \cr
c} \cr
}
您的例子应该可以通过以下代码来解决:
\def\ignore#1{} \def\use#1{#1}
\let\process=\ignore %
%\let\process=\use % select, what you want
并在对齐宏中使用它(它只不过是\halign
原始的):
\begin{align}
a &=b
\process{%
\nonumber\\&=
\textrm{intermediate step}
}
\nonumber\\&=
\textrm{final answer}
\end{align}
另请参阅 TeXbook,第 248 页。