我的新命令在其他环境中不起作用(align*)

我的新命令在其他环境中不起作用(align*)

说明该问题的最小示例:

\documentclass[12pt]{article}
\usepackage{amsmath}

%%% variable declaration:
\newlength{\temp}%
\newlength{\tempp}%
\newlength{\Flinewidth}%
\setlength{\Flinewidth}{0.5pt}%
\newlength{\Fraiseheight}%
\setlength{\Fraiseheight}{1ex}%
\addtolength{\Fraiseheight}{-\Flinewidth}%
\newlength{\Fantecedentheight}%
\newlength{\Fconsequentdepth}%
\newsavebox{\Fantecedent}%
\newsavebox{\Fconsequent}%

%%% conditional stroke \Fconditional[content]{consequent}{antecedent}:
\newcommand{\Fconditional}[3][]%
{%
  \unskip
  \sbox{\Fantecedent}{%
    \rule{0pt}{\baselineskip}% this is a strut
    \ensuremath{#3}}%
  \settoheight{\Fantecedentheight}{%
    \rule{0pt}{\baselineskip}%
    \ensuremath{#3}}%  
  \sbox{\Fconsequent}{%
    \rule[-0.3\baselineskip]{0pt}{0.3\baselineskip}% this is a strut
    \ensuremath{#2}}%
  \settodepth{\Fconsequentdepth}{%
    \rule[-0.3\baselineskip]{0pt}{0.3\baselineskip}%
    \ensuremath{#2}}%
  \setlength{\temp}{\lineskip}%
  \addtolength{\temp}{\Fantecedentheight}%
  \addtolength{\temp}{\Fconsequentdepth}%
  \setlength{\tempp}{\temp}%
  \addtolength{\tempp}{-\Fraiseheight}%
  \mbox{%
    \ensuremath{#1\unskip}%
    \kern-\Flinewidth%
    \rule[-\tempp]{\Flinewidth}{\temp}%
    \settowidth{\temp}{\usebox{\Fconsequent}\\\usebox{\Fantecedent}}%
    \parbox[t]{\temp}{\usebox{\Fconsequent}\\\usebox{\Fantecedent}}}%
}%

\begin{document}
  $\Fconditional[A]{B}{C}$
  $\Fconditional[A]{B}{C\Fconditional{D}{E}}$
  \begin{align*}
    \Fconditional[A]{B}{C}
  \end{align*}
\end{document}

此命令完全按照内联数学模式执行其应执行的操作,如下所示:

$\Fconditional[A]{B}{C}$

感谢关于从宏中删除定义的评论,该命令现在也可以嵌套使用,如下所示:

$\Fconditional[A]{B}{C\Fconditional{D}{E}}$

但是,如果我在 align* 环境中调用相同的命令,如下所示:

\begin{align*}
  \Fconditional[A]{B}{C}
\end{align*}

我收到以下错误消息:

! 对齐制表符 & 位置错误。
\math@cr@@@ ->&
\omit \global \advance \row@ \@ne \ifst@rred \nonumber \fi \i...
l.51 \end{align*}

无论我是否在 align* 环境中实际使用任何 & 字符,都会发生这种情况。忽略错误会产生部分输出。

抱歉,我之前没有提供适当的最小示例。

答案1

使用\\

\settowidth{\temp}{\usebox{\Fconsequent}\\\usebox{\Fantecedent}}%

毫无意义。那里没有“上下文”来赋予换行符意义。

因此,\\被环境“捕获” align,导致错误。

我假设你想假设和\temp的最大宽度。用 TeX 构造替换表达式\Fconsequent\Fantecedent\settowidth

\ifdim\wd\Fconsequent>\wd\Fantecedent
  \setlength{\temp}{\wd\Fconsequent}%
 \else
  \setlength{\temp}{\wd\Fantecedent}%
\fi

可以完成这项工作。我认为有更优雅、更 LaTeX 的方式……

相关内容