文本不尊重 align* 内 NewDocumentCommand 中的 \text

文本不尊重 align* 内 NewDocumentCommand 中的 \text

align*环境中,我有以下形式的行

\Rightarrow &<\texttt{Program Code}, [a \mapsto 1, b \mapsto 2]> &\text{Rule Name}\\
\Rightarrow &<\texttt{Program Code 2}, [a \mapsto 2, b \mapsto 3]> &\text{Rule Name 2} \\

给予

上述代码的 LaTeX 渲染

我想制作一个宏来使这个过程变得更容易,其形式

\pline{Program Code}{a \mapsto 2,b \mapsto 2}{Rule name}

我希望第三个参数(规则名称)是可选的。如果是这样,它不应该显示在右侧的行上。

我本来想使用原生的ifx/else组合,但我切换到了xparse包。现在,我有这个:

\NewDocumentCommand{\pline}{+m +m o}{
    \Rightarrow &<\texttt{#1}, \ensuremath{[#2]}>
    \IfValueTF{#3}
        {&\text{#3}}
}

但是,规则名称没有正确对齐。参见下面的演示:

\begin{align*}
    % Explicit Code
    \Rightarrow &<\texttt{Program Code}, [a \mapsto 1, b \mapsto 2]> &\text{Rule Name} \\
    \Rightarrow &<\texttt{Program Code 2}, [a \mapsto 2, b \mapsto 3]> &\text{Rule Name 2} \\\\
    % Commands
    \pline{Program Code}{a \mapsto 1,b \mapsto 2}{Rule Name} \\
    \pline{Program Code 2}{a \mapsto 2,b \mapsto 3}{Rule Name 2}
\end{align*}

对齐已修复,但字体错误。

为了解决这个问题,我将 放在 前面&\IfValueTF并将其从 之前移除\text{#3}。然而,虽然这解决了对齐问题,但字体仍然不正确,而且似乎停留在数学模式,尽管\text

我该如何解决这两个问题?

最小工作示例:

\documentclass[notitlepage]{report}

\usepackage{mathpazo}
\usepackage{amsmath,amssymb}
\usepackage{xparse}

\begin{document}

\NewDocumentCommand{\pline}{+m +m o}{
    \Rightarrow &<\texttt{#1}, \ensuremath{[#2]}>
    \IfValueTF{#3}
        {\&text{#3}}
}

\NewDocumentCommand{\plinealigned}{+m +m o}{
    \Rightarrow &<\texttt{#1}, \ensuremath{[#2]}>
    &\IfValueTF{#3}
        {\text{#3}}
}

\begin{align*}
    % Explicit Code
    \Rightarrow &<\texttt{Program Code}, [a \mapsto 1, b \mapsto 2]> &\text{Rule Name} \\
    \Rightarrow &<\texttt{Program Code 2}, [a \mapsto 2, b \mapsto 3]> &\text{Rule Name 2} \\\\
    % Commands
    \pline{Program Code}{a \mapsto 1,b \mapsto 2}{Rule Name} \\
    \pline{Program Code 2}{a \mapsto 2,b \mapsto 3}{Rule Name 2}\\\\
    % Commands with alignment fixed
    \plinealigned{Program Code}{a \mapsto 1,b \mapsto 2}{Rule Name} \\
    \plinealigned{Program Code 2}{a \mapsto 2,b \mapsto 3}{Rule Name 2}
\end{align*}

\end{document}

该图显示了该问题的所有三种情况。

答案1

\IfValueT不需要\IfValueTF。你放错了&{&\text{#3}}不在{\&text{#3}}\plineo可选参数,你[]不需要{}

\documentclass[notitlepage]{report}

\usepackage{mathpazo}
\usepackage{amsmath,amssymb}
\usepackage{xparse}

\begin{document}

\NewDocumentCommand{\pline}{+m +m o}{
    \Rightarrow &<\texttt{#1}, \ensuremath{[#2]}>
    \IfValueT{#3}
        {&\text{#3}}
}

\NewDocumentCommand{\plinealigned}{+m +m o}{
    \Rightarrow &<\texttt{#1}, \ensuremath{[#2]}>
    &\IfValueT{#3}
        {\text{#3}}
}

\begin{align*}
    % Explicit Code
    \Rightarrow &<\texttt{Program Code}, [a \mapsto 1, b \mapsto 2]> &\text{Rule Name} \\
    \Rightarrow &<\texttt{Program Code 2}, [a \mapsto 2, b \mapsto 3]> &\text{Rule Name 2} \\\\
    % Commands
    \pline{Program Code}{a \mapsto 1,b \mapsto 2}[Rule Name] \\
    \pline{Program Code 2}{a \mapsto 2,b \mapsto 3}[Rule Name 2]\\
    % Commands with alignment fixed
    \plinealigned{Program Code}{a \mapsto 1,b \mapsto 2}[Rule Name] \\
    \plinealigned{Program Code 2}{a \mapsto 2,b \mapsto 3}[Rule Name 2]
\end{align*}

\end{document}

在此处输入图片描述

答案2

您的代码中存在一些错误:

  1. \&text应该&\text
  2. \ensuremath毫无用处
  3. 参数类型应该是m,而不是+m
  4. <不能>用作括号
  5. 可选参数位于方括号内,而不是括号内

我在后面加了一些空格,\Rightarrow并使用\langle\rangle作为尖括号。请注意不同的间距。也是&&\text{}为了更好地对齐。

\documentclass{article}
\usepackage{amsmath,amssymb}

\begin{document}

\NewDocumentCommand{\pline}{m m o}{%
  \Rightarrow{} & \langle\texttt{#1}, [#2]\rangle
  \IfValueT{#3}{&&\text{#3}}%
}

\begin{align*}
\pline{Program Code}{a \mapsto 1,b \mapsto 2}[Rule Name] \\
\pline{Program Code 2}{a \mapsto 2,b \mapsto 3}[Rule Name 2]
\end{align*}

\end{document}

在此处输入图片描述

为什么\ensuremath什么都不做是有用的?命令\pline(如书面)必须在数学模式下使用,因为\Rightarrow

如果您确实想要<>,请将它们变成适当类型的数学原子。

\documentclass{article}
\usepackage{amsmath,amssymb}

\begin{document}

\NewDocumentCommand{\pline}{m m o}{%
  \Rightarrow{} & \mathopen<\texttt{#1}, [#2]\mathclose>
  \IfValueT{#3}{&&\text{#3}}%
}

\begin{align*}
\pline{Program Code}{a \mapsto 1,b \mapsto 2}[Rule Name] \\
\pline{Program Code 2}{a \mapsto 2,b \mapsto 3}[Rule Name 2]
\end{align*}

\end{document}

在此处输入图片描述

相关内容