是否存在一种普遍适用的技术,对于 LaTeX 文档中使用的任何标签/环境,允许在序言中调整该标签/环境实例内容的默认样式?
例如,如果我决定
\emph{}
文档中所有实例的内容不仅应以斜体显示(常见的默认设置),而且还应以粗体显示,那么我该怎么做?类似地,如果我决定所有实例的
\begin{verbatim}...\end{verbatim}
内容不仅应以等宽字体(常见的默认设置)呈现,而且还应以灰色背景呈现,那么我该怎么做?
但更重要的是,除了简单地解释如何处理这两个示例案例之外,您能否概述一下 LaTeX 用户可以遵循的程序?全部以便能够改变任何给定标签/环境的样式。
答案1
让我们只处理第一个例子。LaTeX 声明\emph
为
\DeclareTextFontCommand{\emph}{\em}
所以我们需要查找一下\em
:
\DeclareRobustCommand\em{%
\@nomath\em
\ifdim \fontdimen\@ne\font >\z@
\upshape
\else
\itshape
\fi}
第一条指令,\@nomath\em
如果在数学模式下发现该命令,则引发错误,否则不执行任何操作。条件检查当前字体是否倾斜(在本例中\fontdimen1\font
为正);如果是,则发出\upshape
,否则\itshape
。
因此,如果你想\emph
在直立上下文中选择“粗体斜体”,在斜体上下文中选择“直立粗体”,你必须说
\DeclareRobustCommand\em{%
\@nomath\em
\ifdim \fontdimen\@ne\font >\z@
\upshape\bfseries
\else
\itshape\bfseries
\fi}
这是一个通用的方法吗?不是。
我甚至不会考虑在灰色背景上打印逐字材料所需的更改:该fancyvrb
包提供了这样的功能,并且它的代码是非常复杂的。
在 LaTeX 中,你不能像 HTML 那样简单地将调用传递给浏览器。这两个模型完全不同。
答案2
正如 egreg 所说,没有通用的方法——每个方法都需要单独考虑。因此,\emph
您可以在序言中重新定义命令:
笔记:
- 正如 egreg 指出的那样,这需要使用
\LetLtxMacro
宏包裹letltxmacro
而不是\let
因为\emph
是用 声明的\DeclareRobustCommand
。 - 正如 Caramdir 指出的那样,这可能是也可能不是嵌套使用所需要的
\emph{}
。此重新定义产生交替的粗体斜体,带有粗体直立,而原始定义产生交替的非粗体斜体,带有非粗体直立,如上所示。
代码:
\documentclass{article}
\usepackage{letltxmacro}
\LetLtxMacro\OldEmph\emph
\renewcommand{\emph}[1]{\textbf{\OldEmph{#1}}}%
\begin{document}
\OldEmph{orignal emph}\par
\emph{modified emph}\par
\emph{modified emph with a \emph{nested emph}}
\end{document}