我遇到以下间距不太正确的问题:
这是由以下 LaTex 代码生成的:
\documentclass[a4paper, 12pt]{article}
\newcommand{\opens}[2][]{\restr{\mathcal{T}_{#2}}{#1}}
\newcommand{\restr}[2]{{\ifx\\#2\\ #1 \else #1|#2 \fi}}
\begin{document}
\begin{tabular}{ll}
Want this & Get this \\
$(\mathcal{T})$ & $(\opens{})$ \\
$(\mathcal{T}|X')$ & $(\opens[X']{})$ \\
$(\mathcal{T}_X|X')$ & $(\opens[X']{X})$ \\
\end{tabular}
\end{document}
奇数间距的原因似乎是空下标缩小了 T 的空间。该宏旨\opens
在在不同条件下工作:
- 如果可选参数非空(例如
X'
),那么(且只有这样)它才应该在栏后附加该参数(例如|X'
)。 - 如果给出了主要参数(例如
X
),则应将其作为 T 的下标放置。
我如何才能使\opens
宏工作以便它在所有情况下都能产生正确的间距?
答案1
您说得对,如果有下标,则打印时不带斜体校正,也不会添加斜体校正。如果没有下标,则添加斜体校正。您可以通过以下方式解决问题:
\newcommand{\opens}[2][]{\restr{\mathcal{T}\ifx\\#2\\ \else_{#2}\fi}{#1}}
\newcommand{\restr}[2]{{\ifx\\#2\\ #1 \else #1|#2 \fi}}
答案2
我们来看一个更简单的例子:
\documentclass{article}
\usepackage{amsmath}
\pagestyle{empty}\showoutput
\begin{document}
$\mathcal{T})$
$\mathcal{T}_{X})$
$\mathcal{T}_{})$
\end{document}
日志文件中的相关信息是
....\mathon
....\OMS/cmsy/m/n/10 T
....\kern2.54167
....\OT1/cmr/m/n/10 )
....\mathoff
[...]
....\mathon
....\OMS/cmsy/m/n/10 T
....\hbox(4.78334+0.0)x7.60211, shifted 1.49998
.....\OML/cmm/m/it/7 X
....\OT1/cmr/m/n/10 )
....\mathoff
[...]
....\mathon
....\OMS/cmsy/m/n/10 T
....\hbox(0.0+0.0)x0.5, shifted 1.49998
....\OT1/cmr/m/n/10 )
....\mathoff
我们能看到什么?在第一个公式中,T 和括号之间出现了一个字距:这是 TeX 在数学模式下在字母后添加的特定情况下的斜体校正。在第二个公式中,没有出现这样的字距,因为有一个下标。下标的宽度已经包括了\scriptspace
;事实上,如果我们将其设置\scriptspace
为零,我们得到
....\mathon
....\OMS/cmsy/m/n/10 T
....\hbox(4.78334+0.0)x7.10211, shifted 1.49998
.....\OML/cmm/m/it/7 X
....\OT1/cmr/m/n/10 )
....\mathoff
因为的标准值\scriptspace
是0.5pt。
在第三个公式中,只\scriptspace
添加了,因为下标在那里,虽然是空的:这是一个已知的技巧,为了省略斜体校正,但在您的情况下,它会使您绊倒。
仅当下标不为空时才需要有条件地添加下标。
我不确定我是否会采用你的语法:在我看来,可选参数应该是 T 的可能下标,所以我将为这两种方式提供解决方案。
不\ifx\\#1\\
;我建议采用更强大的\IfValue(TF)
方法\IfBlank(TF)
。
\documentclass{article}
\usepackage{amsmath}
% your syntax
\NewDocumentCommand{\opens}{om}{%
\mathcal{T}\IfBlankF{#2}{_{#2}}% base symbol
\IfValueT{#1}{\,|\,#1}% restr
}
% my syntax
\NewDocumentCommand{\egregopens}{om}{%
\mathcal{T}\IfValueT{#1}{_{#1}}%
\IfBlankF{#2}{\,|\,#2}%
}
\begin{document}
Your syntax
$(\opens{})$
$(\opens[X']{})$
$(\opens[X']{X})$
\bigskip
My syntax
$(\egregopens{})$
$(\egregopens{X'})$
$(\egregopens[X]{X'})$
\end{document}