\newif 在对齐环境中条件性地隐藏推导中的子步骤

\newif 在对齐环境中条件性地隐藏推导中的子步骤

我创建了一个 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 页。

相关内容