这个问题导致了一个新的方案的出现:
embrac
布林赫斯特印刷风格的元素,建议使用斜体文本的直立括号(即写'A(简单的)例子' 而不是 '一个(简单)例子')。我倾向于同意,这样看起来更好。但是,如何使用 LaTeX 实现这一点?当然可以写\emph{a \emph{(}simple\emph{)} example}
,但这很快就会过时。
我想到过两种方法:
- 制作
()
(可能的话[]
)活动字符,并确保它们始终排版直立,或 - 使用虚拟字体或类似的东西施展一些魔法。
我可能能够利用我的知识来实现第一个建议,但我的直觉告诉我第二个选项更优雅。不幸的是,我对 LaTeX 中(虚拟)字体的了解甚至比我对(非)活动字符和 catcode 等的了解还要有限。关于如何做到这一点有什么想法吗?
答案1
LaTeX3 解决方案。我选择简单地按照你说的做,将每个替换为(
,\textup{(}
将每个)
替换为\textup{)}
,并将括号替换为类似方法,然后将结果传递给旧版本的\emph
for 排版。
在一天结束时,xparse
可以让我们轻松地定义\emph
要做的事情,以及\emph*
要执行的旧版本\emph
。
\documentclass{article}
\usepackage{expl3,xparse}
\ExplSyntaxOn
\cs_new_eq:Nc \emph_old:n { emph~ } % Copying the old definition of `\emph`
\cs_new_protected:Npn \emph_braces:n #1 % Set up how braces should be typeset.
{ \mode_if_math:TF {#1} { \textup{#1} } }
\cs_new:Npn \emph_new:n #1 {
\tl_set:Nn \l_emph_tl {#1}
\tl_replace_all:Nnn \l_emph_tl {(}{\emph_braces:n{(}}
\tl_replace_all:Nnn \l_emph_tl {)}{\emph_braces:n{)}}
\tl_replace_all:Nnn \l_emph_tl {[}{\emph_braces:n{[}}
\tl_replace_all:Nnn \l_emph_tl {]}{\emph_braces:n{]}}
\exp_args:NV \emph_old:n \l_emph_tl
}
\RenewDocumentCommand {\emph} {sm} {
\IfBooleanTF {#1} {\emph_old:n {#2}} {\emph_new:n {#2}}
}
\ExplSyntaxOff
\begin{document}
A \emph{(simple) example}, and \emph*{another one (with no correction)}.
Also some math \emph{\((x+y)^2\) and text (again)}.
\end{document}
编辑:Alan Munn 在评论中指出了一个错误。谢谢。
EDIT2:更新expl3
并重命名\tl_replace_all_in:Nnn
为\tl_replace_all:Nnn
。
编辑 3:Barbara Beeton 指出我应该使用\textup
而不是\emph
将括号竖直放置。她还提到“曾经有人建议创建一种‘定理字体’,其中字母为斜体,而括号(圆括号、方括号、花括号)为竖直”,但这种字体从未制作出来。请参阅下面的评论。
编辑 4:我在复制 的定义时有点马虎\emph
,这在最新xparse
更新中被揭露了。LaTeX2e \emph
(与许多其他命令一样)使用\emph
来保存 的真实代码\emph
(请注意尾随空格)。因此,下面的行\ExplSyntaxOn
更改为\cs_new_eq:Nc
... { emph~ }
:“c”参数说明符变为emph~
适当的命令\emph
。
编辑 5:我添加了代码以避免在数学模式下更改括号。或者更确切地说,用于排版括号的命令现在具有数学意识(这比在进行替换时尝试检测数学要简单得多)。
答案2
我同意不要弄乱 catcodes(尽管仅在命令\emph
本身内这样做可能不会有太多问题。)但这是一个相对简单的解决方案,其语义比 Yiannis 的解决方案稍微透明一些:
\documentclass{article}
\newcommand{\bemph}[1]{{\upshape#1}} % define how emphasised brackets should look
\newcommand{\ep}[1]{\bemph{(}#1\bemph{)}} % parentheses
\newcommand{\eb}[1]{\bemph{[}#1\bemph{]}} % square brackets
\begin{document}
This is \emph{a \ep{simple} example}.
\emph{This is \emph{a \ep{simple} example}.} % also works embedded in another emph
\end{document}
这样做的好处是,如果您需要更改内容\emph
,您可以独立控制强调括号。例如,如果您将其重新定义\emph
为下划线,或者\textbf
您可以相应地调整括号。
答案3
我会尽量保持简单,避免使用 catcode 之类的东西。我会定义一个小宏,如下所示(如果您愿意,可以使用更短的名称)。
\documentclass{article}
\usepackage{xspace}
\def\bracketemphasis#1#2{(\emph{#1})\xspace\emph{#2}\xspace}
\begin{document}
\bracketemphasis{simple}{example}.
\end{document}
可以xspace
正确处理标点符号后的空格,这就是我将其包括进来的原因。
\xspace
应该用在主要用于文本的宏的末尾。除非宏后面跟着标点符号,否则它会添加一个空格。
答案4
我的看法:amslatex
有\textup
(相当于\rom
),它是为此而设计的(当然,您必须手动将其放在所有需要的地方)。
此外,我非常确信这应该很容易做到luatex
。