斜体文本中的直立括号

斜体文本中的直立括号

这个问题导致了一个新的方案的出现:
embrac

布林赫斯特印刷风格的元素,建议使用斜体文本的直立括号(即写'A简单的例子' 而不是 '一个(简单)例子')。我倾向于同意,这样看起来更好。但是,如何使用 LaTeX 实现这一点?当然可以写\emph{a \emph{(}simple\emph{)} example},但这很快就会过时。

我想到过两种方法:

  • 制作()(可能的话[])活动字符,并确保它们始终排版直立,或
  • 使用虚拟字体或类似的东西施展一些魔法。

我可能能够利用我的知识来实现​​第一个建议,但我的直觉告诉我第二个选项更优雅。不幸的是,我对 LaTeX 中(虚拟)字体的了解甚至比我对(非)活动字符和 catcode 等的了解还要有限。关于如何做到这一点有什么想法吗?

答案1

LaTeX3 解决方案。我选择简单地按照你说的做,将每个替换为(\textup{(}将每个)替换为\textup{)},并将括号替换为类似方法,然后将结果传递给旧版本的\emphfor 排版。

在一天结束时,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

相关内容