我正在定义一个在某处使用下标的命令。我希望当我将下标的相应命令输入保持打开状态时,下标会消失,但 LaTeX 会抛出错误,因为下标中没有输入任何字符。现在我想在输入后输入一个虚拟字符,以确保始终至少打印一个字符。但是,我不希望这个虚拟字符出现。它只需要存在以欺骗 LaTeX。
如果我输入 \infty,我会得到一个无穷符号,如果我打印我想要的字符,LaTeX 会打印一个没有黑色的字符。
在此代码中,命令 \spacechar 充当我想要的字符
\newcommand{\tup}[3]{(-\; #1 -\! \underset{\! #2 \,\,\,}{)_{#3\spacechar}}}
代替
\newcommand{\tup}[3]{(-\; #1 -\! \underset{\! #2 \,\,\,}{)_{#3}}}
当 #3 为空时,它会中断。
代码运行的一些示例
\documentclass{article}
\usepackage{amsmath}
\usepackage{mathtools}
\newcommand{\tup}[3]{(-\; #1 -\! \underset{\! #2 \,\,\,}{)_{#3}}}
\begin{document}
\noindent $\tup{x_i}{i}{n}$\\
$(-\; x_i -\! \underset{\! \,\,\,}{)}$
\end{document}
类似这样的功能在 LaTeX 的许多其他地方也很有用,例如当 LaTeX 想要删除句子开头的空格时。
这是一个稍微相关但却不能令人满意的答案。 与字符一样宽的空白它给出空格命令,这些命令不是实际的字符。它们是空格,而空格无法欺骗 LaTeX。
这也不是我想要的。明确的空格字符?它给我的是可见的空白,而不是不可见的字符。
简而言之,我想要一个完全不打印任何内容的字符。
答案1
您在使用时遇到的问题\underset
是它试图将下划线材料居中。如果我理解您的意图,您希望下划线与括号左对齐。为此,我使用左对齐堆栈。
#2
这里,我展示了和#3
存在或不存在的4 种情况。
\documentclass{article}
\usepackage{stackengine}
\usepackage{mathtools}
\newcommand{\tup}[3]{(-\; #1 -\!
\ensurestackMath{\stackengine{1pt}{)_{#3}}{\scriptstyle#2}{U}{l}{F}{F}{S}}}
\begin{document}
\noindent $\tup{x_i}{i}{n}$\\[4pt]
$\tup{x_i}{i}{}$\\[4pt]
$\tup{x_i}{}{n}$\\[4pt]
$\tup{x_i}{}{}$
\end{document}
答案2
不需要“ \spacechar
”。
\documentclass{article}
\usepackage{amsmath}
\usepackage{mathtools}
\newcommand{\tup}[3]{%
({-}\; #1 \;{-}%
\mathclose{\underset{\mathclap{#2\,}}{)}}%
\if\relax\detokenize{#3}\relax\else
\mathclose{}_{#3}%
\fi
}
\begin{document}
$\tup{x_i}{i}{n}$
$\tup{x_i}{i}{}$
\end{document}
我们\underset{\mathclap{#1\,}{)}
将参数放在括号下面,使整个构造成为一个 Close 原子;如果第三个参数不为空,幻像括号接收下标。
我还提出了一种更友好的语法,其中下标用标准指定_
:
\documentclass{article}
\usepackage{amsmath}
\usepackage{mathtools}
\usepackage{xparse}
\NewDocumentCommand{\tup}{mme{_}}{%
({-}\; #1 \;{-}
\mathclose{\underset{\mathclap{#2\,}}{)}}%
\IfValueT{#3}{\mathclose{\vphantom)}_{#3}}%
}
\begin{document}
$\tup{x_i}{i}_{n}$
$\tup{x_i}{i}$
\end{document}
类似地,但第二个参数也是可选的,以防有时不需要括号下的变量。
\documentclass{article}
\usepackage{amsmath}
\usepackage{mathtools}
\usepackage{xparse}
\NewDocumentCommand{\tup}{mme{_}}{%
({-}\; #1 \;{-}
\mathclose{\underset{\mathclap{#2\,}}{)}}%
\IfValueT{#3}{\mathclose{\vphantom)}_{#3}}%
}
\begin{document}
$\tup{x_i}{i}_{n}$
$\tup{x_i}{i}$
\end{document}
答案3
问题中的定义是正确的,没有中断。我猜我在实际文件中忘记了括号。@Steven B. Segletes 的上述回答确实使命令变得更好。
然而,对于我关于隐形字符的问题,我找到了一个不完美的解决方案。
\usepackage{xcolor}
\newcommand{\spacechar}{\text{\textcolor{white}{\tiny .}}}
这将打印一个微小的白点,只要背景不是白色就可以起作用。
答案4
带有xparse
可选参数:
\documentclass{article}
\usepackage{amsmath}
\usepackage{mathtools}
\usepackage{xparse}
\ExplSyntaxOn
\NewDocumentCommand \otup { m O{} O{} }{
(-\; #1 -\! \underset{\tl_if_empty:nTF{#3}{}{\!} #2 \,\,\,}{\tl_if_empty:nTF{#3}{\!\!}{})\sb{#3}}
}
\ExplSyntaxOff
\begin{document}
$\otup{x_i}[i][n]$
$\otup{x_i}[i]$
$\otup{x_i}$
\end{document}
这不使用stackengine
另一个答案的解决方案,而是当第三个参数为空(未给出)时,右括号会向后移动一点,如果参数不为空,则下划线参数本身(#2
)会向左移动。
请注意,\ExplSyntaxOn
字符_
不再是数学下标,因此\sb
改用。