考虑一下这个 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
只是为了使示例更加通用。 用它就一样了。