为什么“textsc”和“texttt”的组合会导致“未定义的控制序列。”错误?

为什么“textsc”和“texttt”的组合会导致“未定义的控制序列。”错误?

考虑一下这个 MnotWE:

\documentclass[12pt,letterpaper]{article}

\usepackage{lmodern}
\usepackage[T1]{fontenc}

\newcommand*{\fnn}[1]{\text{\texttt{#1}}}
\newcommand*{\Ker}[1]{\textsc{ker}(\fnn{#1})}

\begin{document}
     $\Ker{f}$
\end{document}

它会产生错误:

未定义控制序列。$\Ker{f}

但是,这样编译就没问题了:

\documentclass[12pt,letterpaper]{article}

\usepackage{lmodern}
\usepackage[T1]{fontenc}

\newcommand*{\fnn}[1]{\text{\texttt{#1}}}
\newcommand*{\Ker}[1]{\textsc{ker}(#1)}

\begin{document}
     $\Ker{f}$
\end{document}

为什么?

答案1

\text需要amsmath(或至少amstext需要amsmath加载)。

但是,一旦amsmath加载,\text就变得多余,并且\texttt如果\fnn是下标或上标, 也足够了。\mathtt不过,您应该考虑 。从以下示例中应该可以清楚地看出原因:

\documentclass{article}
\usepackage{amsmath}

\newcommand*{\fnn}[1]{\texttt{#1}}
\newcommand*{\Ker}[1]{\textsc{ker}(\fnn{#1})}

\newtheorem{theorem}{Theorem}

\begin{document}

Some text with $\Ker{f}$ and $X_{\fnn{f}}$

\begin{theorem}
Some text with $\Ker{f}$ and $X_{\fnn{f}}$
\end{theorem}

\end{document}

如您所见,斜体上下文也作用于 的参数\fnn。添加\text不会产生更好的效果。

在此处输入图片描述

这是一个可能更好的定义:

\documentclass{article}
\usepackage{amsmath}

\newcommand*{\fnn}[1]{\mathtt{#1}}
\newcommand*{\Ker}[1]{\operatorname{\textsc{ker}}(\fnn{#1})}

\newtheorem{theorem}{Theorem}

\begin{document}

Some text with $\Ker{f}$ and $X_{\fnn{f}}$

\begin{theorem}
Some text with $\Ker{f}$ and $X_{\fnn{f}}$
\end{theorem}

\end{document}

在此处输入图片描述

如果你不缺数学小组,可以添加

\DeclareMathAlphabet{\mathsc}{\encodingdefault}{\familydefault}{m}{sc}

会更好:

\documentclass{article}
\usepackage{amsmath}

\DeclareMathAlphabet{\mathsc}{\encodingdefault}{\familydefault}{m}{sc}

\newcommand*{\fnn}[1]{\mathtt{#1}}
\newcommand*{\Ker}[1]{\operatorname{\mathsc{ker}}(\fnn{#1})}

\newtheorem{theorem}{Theorem}

\begin{document}

Some text with $\Ker{f}$ and $X_{\fnn{f}}$

\begin{theorem}
Some text with $\Ker{f}$ and $X_{\fnn{f}}$
\end{theorem}

\end{document}

输出是相同的,但是使用上面的“简单版本”,如果您使用的上下文\Ker是斜体或粗体并且您使用的字体系列为小型大写字母提供了不同的形状/粗细,则您可能会面临形状改变的风险。

注意:我没有加载lmodern只是为了使示例更加通用。 用它就一样了。

相关内容