新命令和带划线的 L

新命令和带划线的 L

我经常需要粗体L,所以我喜欢使用\newcommand\L\{\mathbf{L}}。但这给我带来了一个问题,因为我需要带L笔划的 来写“Łoś 定理”,而命令是\L

\L是否可以这样定义,使得它L在数学模式之外给出一个笔划,而L在数学模式之内给出一个粗体?

如果没有,我怎样才能L以不同的方式获得带有笔划的图形,以便我仍然可以在数学模式下使用\L粗体L

答案1

关注您的观点“我怎样才能以不同的方式获得带有笔划的 L,以便我仍然可以在数学模式下使用 \L 表示粗体 L?”,其他人(尤其是 egreg)指出重新定义绝对不是一个好主意\L

但既然这是你的问题的本质,如果你想不顾一切,你可以这样得到它:

\documentclass[english]{article}
\let\strokeL\L
\renewcommand\L{\mathbf{L}}
\begin{document}
In \strokeL o\'s's Theorem, we need stroke L, but inline, $\L$ gives bold L.
\end{document}

为了更易于使用,您可以检查是否存在数学模式,并即时确定的定义\L。这样,您就可以\L在文本和数学模式下使用并获得所希望的结果。

\documentclass[english]{article}
\let\strokeL\L
\DeclareRobustCommand{\L}{\ifmmode\mathbf{L}\else\strokeL\fi}
\begin{document}
In \L o\'s's Theorem, we need stroke L, but inline, $\L$ gives bold L.
\end{document}

在此处输入图片描述

感谢 egreg 指出了 的必要性,\DeclareRobustCommand而不是\newcommand,正如 David Carlisle 最初指出的那样。不过,需要重申的是,像 egreg 这样的专家警告不要重新定义\L

答案2

虽然不太确定,但可以定义一个在文本或数学模式下表现不同的宏。有些 LaTeX 宏可以做到:

\strut \verb \phantom \smash \ensuremath \underline
\, \$ \{ \} \P \S \dag \ddag \_ \copyright \pounds \dots
\@inmatherror \@inmathwarn <...other internal macros...>

第一组由以下宏组成:必须由于技术原因,在一种模式或另一种模式下执行不同的调用;例如,在文本模式下\strut调用\unhcopy\strutbox,而在水平模式下调用\uncopy\strutbox。当然,\ensuremath在两种模式下必须做不同的事情。

第二组由在两种模式下打印相同符号但需要不同技术实现的命令组成。第三组由内部宏组成,这些宏可以发出信号,表示某些命令不能或不应该在数学模式下使用,或者执行重要的簿记工作。

值得注意的是,前两组命令的语义没有改变:对于最终用户来说,它们执行的是“相同的操作”。类似于\\根据上下文具有几种不同含义,但对于最终用户来说,它始终意味着“终止一行”。

定义在文本和数学模式中具有不同语义的宏并不是好的做法,因为它会妨碍输入的清晰度并难以记住它的含义。

作为一般规则,属于 LaTeX 内部字符表示 (LICR) 的命令不应重新定义,因为它们可能会在意想不到的地方出现。有一次,我收到一位用户的疯狂消息,他无法打印他的合著者的名字,而这位用户恰好是土耳其人,名字以“Ş”开头;我的同事在他的序言中写道,

\def\c{\gamma}

当然必须输入“Ş”\c{S}Şinputenc翻译为\c{S}无论如何)。


在这篇长篇大论之后,旨在阻止你重新定义\L,以下是你可以做的事情

\let\polishL\L % save the old meaning
\DeclareRobustCommand{\L}{\ifmmode\mathbf{L}\else\polishL\fi}

我们不希望\L在移动论点中不合时宜地扩大,比如说

\section{\L o\'s theorem}

所以我们需要将其声明为一个强大的命令。然而,这并不是一个好的定义,因为诸如这样的命令\L是以“编码依赖”的方式定义的。因此,将的含义保存\L在某个地方可能会赋予它与文档中的含义不同的含义。假设一个包在文档开始时加载T1输出编码(一些字体包可能会这样做)。如果你不T1事先加载编码,你的\polishL意思是

\OT1-cmd \L \OT1\L

而不是正确的

\T1-cmd \L \T1\L

这可能会导致模糊的字体相关错误消息或错误的输出。

最后的话

不要。根据粗体数学 L 的含义使用有意义的宏,而不是\L

相关内容