![我的新命令在其他环境中不起作用(align*)](https://linux22.com/image/252415/%E6%88%91%E7%9A%84%E6%96%B0%E5%91%BD%E4%BB%A4%E5%9C%A8%E5%85%B6%E4%BB%96%E7%8E%AF%E5%A2%83%E4%B8%AD%E4%B8%8D%E8%B5%B7%E4%BD%9C%E7%94%A8%EF%BC%88align*%EF%BC%89.png)
说明该问题的最小示例:
\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 的方式……