一个小烦恼(可能与印刷良好做法一致也可能不一致):我不喜欢在:
数学符号后面加斜体,尤其是直立的符号]
,像这样:
不过,在很多地方,文本都是斜体(通常是由于\emph
),我使用:
数学公式。我可以解决这个问题:
- 总是在数学后面使用
\textup{:}
而不是;:
- 不要将斜体文字与数学混合;
- 重新措辞我的句子,例如永远不要放在
:
数学后面; - 使用一些 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)的包不兼容。