在内联数学模式中不包含文本标点符号是否始终是最佳做法?

在内联数学模式中不包含文本标点符号是否始终是最佳做法?

该网站已经指出,例如来自 egreg,文本标点符号不属于内联数学中的公式。我一直遵循这种做法,所以我写成for all $v\in V$, where ...而不是for all $v\in V,$ where ...。但是,第一个版本会阻止 和 逗号之间的字距调整。请注意,第二个版本中的V逗号更接近:V

输出与V

\documentclass{article}
\begin{document}
$v\in V$, where \quad $v\in V,$ where 
\end{document}

V请注意,如果我将其替换为A:,则两个版本之间没有区别:

输出为A

现在我想知道:我是否应该开始在公式中加入标点符号以实现正确的字距调整,至少只要使用的字体中的文本和数学标点符号看起来相同?或者有什么原因导致字距调整并不可取?

答案1

如果您想要保持字距但仍保持数学表达式在逻辑上纯粹的句子标点符号,并且实际上可用于使用不同文本和数学字体的文档类,您可以在数学后添加手动更正,但在实践中我不确定你是否想这样做:

\documentclass{article}
\def\kn#1#2{{\sbox0{$#1#2$}\sbox2{$#1{}#2$}\kern\dimexpr\wd0-\wd2\relax}#2}
\begin{document}
$v\in V$\kn V, where \quad $v\in V,$ where 
\end{document}

在此处输入图片描述

答案2

(更新代码以确保 Lua 函数不会在类似逐字的环境中执行字符串替换)

这是一个基于 LuaLaTeX 的方法。它结合\knDavid Carlisle 之前的回答使用 Lua 函数(分配给process_input_buffer回调)扫描输入流并自动用 David C 的代码替换所有匹配项。Lua 函数可以通过 LaTeX 宏和<Upppercase Letter>$<punctuation mark>打开或关闭。\adjustcommaOn\adjustcommaOff

以下代码中使用的应用程序受到以下启发这个问题,已关闭,因为与当前问题重复。请注意,如果 LaTeX 位于逐字类环境(例如verbatimVerbatimlstlisting)内,Lua 函数将暂停其操作。

在此处输入图片描述

\documentclass{article}
% cf. https://tex.stackexchange.com/a/101059/5001:
\def\kn#1#2{{\sbox0{$#1#2$}\sbox2{$#1\mkern0mu#2$}\kern\dimexpr\wd0-\wd2\relax}#2}

\usepackage{luacode,geometry}
\begin{luacode}
in_verbatim = false
function ajust_punctuation ( s )
   if string.find     ( s , "\\begin{[vV]erbatim}" ) 
      or  string.find ( s , "\\begin{lstlisting}" ) then
          in_verbatim = true
   elseif string.find ( s , "\\end{[vV]erbatim}" ) 
      or  string.find ( s , "\\end{lstlisting}" ) then
          in_verbatim = false
   elseif in_verbatim == false then
      -- scan for "<UppercaseLetter><$><PunctuationMark>" pattern:
      s = string.gsub ( s , "(%u)%$(%p)", "%1$\\kn %1%2" ) 
   end
   return s 
end
\end{luacode}
\newcommand{\adjustcommaOn}{%
    \luadirect{luatexbase.add_to_callback(
   "process_input_buffer", ajust_punctuation, "ajust_punctuation" )}}
\newcommand{\adjustcommaOff}{%
   \luadirect{luatexbase.remove_from_callback(
   "process_input_buffer", "ajust_punctuation" )}}

\setlength\parindent{0pt} % just for this example
\obeylines 

\begin{document}

Proper spacing: $A$, $E$, $Q$, $R$. 
\adjustcommaOn
Proper spacing: $A$, $E$, $Q$, $R$. --- Virtually no change.

\smallskip
\adjustcommaOff
Acceptable spacing: $B$, $C$, $D$, $G$, $O$, $S$, $Z$. 
\adjustcommaOn
Acceptable spacing: $B$, $C$, $D$, $G$, $O$, $S$, $Z$. --- A little bit better.

\smallskip
\adjustcommaOff
Poor spacing: $F$, $H$, $I$, $J$, $K$, $M$, $N$, $P$, $T$, $U$, $V$, $W$, $X$, $Y$.
\adjustcommaOn
Poor spacing: $F$, $H$, $I$, $J$, $K$, $M$, $N$, $P$, $T$, $U$, $V$, $W$, $X$, $Y$. --- A major improvement.

% Note that "\adjustcommaOn" is in effect.
\begin{verbatim} 
Proper spacing: $A$, $E$, $Q$, $R$.
Acceptable spacing: $B$, $C$, $D$, $G$, $O$, $S$, $Z$.
Poor spacing: $F$, $H$, $I$, $J$, $K$, $M$, $N$, $P$, $T$, $U$, $V$, $W$, $X$, $Y$.
\end{verbatim}
\end{document}

相关内容