在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} \\
给予
我想制作一个宏来使这个过程变得更容易,其形式
\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}}
。\pline
是o
可选参数,你[]
不需要{}
。
\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
您的代码中存在一些错误:
\&text
应该&\text
\ensuremath
毫无用处- 参数类型应该是
m
,而不是+m
<
不能>
用作括号- 可选参数位于方括号内,而不是括号内
我在后面加了一些空格,\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}