空格字符

空格字符

我正在定义一个在某处使用下标的命令。我希望当我将下标的相应命令输入保持打开状态时,下标会消失,但 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改用。

在此处输入图片描述

相关内容