如何确保数学模式后的冒号始终直立?

如何确保数学模式后的冒号始终直立?

一个小烦恼(可能与印刷良好做法一致也可能不一致):我不喜欢在:数学符号后面加斜体,尤其是直立的符号],像这样: 在此处输入图片描述

不过,在很多地方,文本都是斜体(通常是由于\emph),我使用:数学公式。我可以解决这个问题:

  1. 总是在数学后面使用\textup{:}而不是;:
  2. 不要将斜体文字与数学混合;
  3. 重新措辞我的句子,例如永远不要放在:数学后面;
  4. 使用一些 LaTeX 魔法来确保:-after-math 始终直立。

我一直在使用策略 1,但是对此感到有点厌烦,并且想知道是否可以为了好玩而实施策略 4,所以我想到了以下方法:

\documentclass{article}
\usepackage[T1]{fontenc}
\makeatletter


\newcommand*{\replace@colon}{%
  % typeset an upright colon,
  % then ignore the next character, which is the italic colon
  \textup{:}\@gobble
}

\newcommand*{\colon@scan}{%
  \@ifnextchar:\replace@colon\relax
}

\everymath{\aftergroup\colon@scan}


\makeatother
\begin{document}
\itshape
$0.5 \in [0,1]$:
it works with \$!

\(0.5 \in [0,1]\):
doesn't work with \verb|\(|.

\[0.5 \in [0,1]\]:
doesn't work with \verb|\[|.

\begin{math}
  0.5 \in [0,1]
\end{math}:
doesn't work with \verb|\begin{math}|.

\end{document}

因此,这种“黑客”只适用于最简单的数学,:$...$:,如下所示: 在此处输入图片描述

(不,我永远不会使用\[...\]:,但我认为即使在这种奇怪的情况下让黑客也能工作也很好)

我认为我无法想到解决方法的主要原因是我真的不明白\everymath代码究竟“何时”发生;有没有办法让我的冒号黑客始终有效?

- 编辑 - 我还想出了这个替代的“黑客”方法:

\newcommand{\realcolon}{}  % just ensure the name's available
\edef\realcolon{\char`:\relax}  % store the original meaning of ":"
\catcode`:=\active
\let:\realcolon
\newcommand*{\upcolon}{\textup{\realcolon}\global\let:\realcolon}
\newcommand*{\makecolonupright}{\global\let:\upcolon}
\everymath{\aftergroup\makecolonupright}

这种方法:

  • 适用于$
  • 适用于\(
  • 不适用于\[
  • 适用于\begin{math}

答案1

您可以采用个别方法解决每个案例:

\documentclass{article}

\long\def\addto#1#2{\expandafter\def\expandafter#1\expandafter{#1#2}}
\def\colonscan{\futurelet\next\colonscanA}
\def\colonscanA{\ifx\next:\expandafter\colonscanB\fi}
\def\colonscanB#1{\textup{:}}
\def\colonscanE#1\ignorespaces\fi{#1\ignorespaces\fi\colonscan}
\everymath{\aftergroup\colonscan} % for cases $...$:
\addto\){\colonscan}              % for cases \(...\):
\addto\endmath{\colonscanE}       % for cases \end{math}:

\makeatother
\begin{document}
\itshape
$0.5 \in [0,1]$:
it works with \$!

\(0.5 \in [0,1]\):
it works with \verb|\(|.

\[0.5 \in [0,1]\]:
doesn't work with \verb|\[|.

\begin{math}
  0.5 \in [0,1]
\end{math}:
it works with \verb|\begin{math}|.

\end{document}

答案2

数学模式下的冒号始终是直立的,不会倾斜。为了解决您的问题,您可以将冒号里面内联数学模式块,如下所示:

$0.5 \in [0,1]:$

答案3

你可以定义

\newcommand\upcolon{\textup{:}}

可能使用xspace以免吞噬尾随的空格。

答案4

(这与我在- 编辑 - 问题的一部分)

如(例如)“TeX by topic”中所述, \everymath作用于内联数学,而 \everydisplay作用于显示的数学。因此,可以:在任何数学之后调整,即使在显示的数学之后使用冒号可能不是一个好主意(从语义和印刷上来说)。

\makeatletter
\newcommand*{\realcolon}{}       % just ensure the name's available
\edef\realcolon{\char`:\relax}   % store the original meaning of colon
\NewCommandCopy\pickcolon\@firstoftwo
\catcode`:=\active
\def:{\pickcolon
  {\realcolon}
  {\textup{\realcolon}\global\let\pickcolon\@firstoftwo}%
}
\newcommand*{\makecolonupright}{\global\let\pickcolon\@secondoftwo}
% (the following explanations are from "TeX by topic" by Victor Eijkhout)
% \everymath<token parameter> token list inserted at the start of non-display math
% \aftergroup<token> save the next token for insertion after the current group
\everymath{\aftergroup\makecolonupright}
% erase/comment this next line to leave colons after displayed math untouched
\everydisplay{\aftergroup\makecolonupright}  
\makeatother

警告:由于这通过转变:为活动字符并改变其 catcode 来实现,因此它可能与假定:为“其他”符号(catcode 12)的包不兼容。

相关内容