宏中的间距可能为空下标

宏中的间距可能为空下标

我遇到以下间距不太正确的问题:

1

这是由以下 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}

在此处输入图片描述

相关内容