将 texttt 中的所有单引号更改为直引号

将 texttt 中的所有单引号更改为直引号

我有一个文档,'里面有很多字符texttt。有没有办法让它们在 中全部显示为直线texttt

我知道我可以用以下方法搜索/替换所有'内容\textquotesingle

也许有一些序言声明来告诉texttt将所有内容呈现'\textquotesingle

答案1

这是一种使用活动字符的方法,但仍然允许\texttt在其他宏的参数内使用。(因为它使用\scantokens)。

\documentclass{article}
\usepackage[T1]{fontenc}
\usepackage{upquote}
\usepackage{etoolbox} % for robustify

\robustify{\texttt}
\let\originaltexttt\texttt

\begingroup
\catcode`'=\active
\catcode``=\active
\globaldefs1
\makeatletter
\renewrobustcmd{\texttt}[1]{%
   {%
   \everyeof{\noexpand}\endlinechar-1
   \expandafter\catcode\string``=\active
   \expandafter\catcode\string`'=\active
   \let'\textquotesingle
   \let`\textasciigrave
   \ifx\encodingdefault\upquote@OTone
    \ifx\ttdefault\upquote@cmtt
     \def'{\char13 }\def`{\char18 }%
    \fi
   \fi
   \scantokens{\originaltexttt{#1}}%
   }%
}%
\endgroup


\begin{document}

\null\vfill
abc'def---\texttt{abc'def}---abc'def 
\footnote{\texttt{This is a footnote ``''}}

\textit{\texttt{abc`def'ghi}}---\texttt{\textit{abc`def'ghi}}
\footnote{\textit{\texttt{This is another footnote ``''}}}

\end{document}

相比之下的优势我的其他答案是它只使用文档打字机字体,不对其进行修改。缺点是\scantokens可能会留下一些惊喜。具体来说,我想到的主要问题是,不应该在空格字符已激活的上下文中使用它,主要情况是alltt环境(当然verbatim没有问题,因为\texttt宏不会被执行)。但这已经是一个有点专业的环境了,所以一般来说这样就没问题了。

在此处输入图片描述

请注意,我的方法加载包upquote因此逐字环境也将带有直单引号。

答案2

这里我重新定义了\texttt使之'活跃 并将其自身替换为\textquotesingle。原始定义保存在 中\svtexttt

'编辑后返回非活动状态\texttt

letltxmacro根据 egreg 的建议,重新编辑使用。

'重新编辑以在使用后恢复最初定义\texttt,以免干扰数学转换\prime(向 David 致敬/含糊其辞地咒骂)。

\documentclass{article}
\usepackage{textcomp,lmodern,letltxmacro}
\LetLtxMacro{\svtexttt}{\texttt}
\catcode`'=\active %
\let\svprime'
\renewcommand\texttt{\catcode`'=\active \def'{\textquotesingle}\textttaux}
\newcommand\textttaux[1]{\svtexttt{#1}\gdef'{\svprime}\catcode`'=12 }
\catcode`'=12 %
\begin{document}
\svtexttt{That's life!}

versus

\texttt{That's life!}

Is ' active? No. 

Testing prime: $x' =dx/dt$
\end{document}

在此处输入图片描述

答案3

您可以使其处于'活动状态,但这有一个很大的缺点,即\texttt不能再用作另一个命令的参数。

\documentclass{article}
\usepackage{textcomp}
\usepackage{xparse}
\usepackage{etoolbox} % for robustify

\robustify\texttt

\let\originaltexttt\texttt
\newcommand\activatestraightquote{%
  \begingroup\lccode`~=`'
  \lowercase{\endgroup\let~}\textquotesingle
  \catcode`'=\active
}
\renewrobustcmd{\texttt}{%
  \begingroup\activatestraightquote
  \innertexttt
}
\newcommand{\innertexttt}[1]{\originaltexttt{#1}\endgroup}

\begin{document}

abc'def \texttt{abc'def} abc'def

\end{document}

在此处输入图片描述

一个可以解决此问题的解决方案。

\documentclass{article}
\usepackage{xparse}
\usepackage{textcomp}

\ExplSyntaxOn
\RenewDocumentCommand{\texttt}{m}
 {
  \group_begin:
  \tl_set:Nn \l_jmlarson_texttt_tl { #1 }
  \regex_replace_all:nnN { ' } { \c{textquotesingle} } \l_jmlarson_texttt_tl
  \ttfamily
  \tl_use:N \l_jmlarson_texttt_tl
  \group_end:
 }
\ExplSyntaxOff


\begin{document}

\section{abc'def \texttt{abc'def} abc'def}

abc'def \texttt{abc'def} abc'def

\end{document}

这也可以扩展,以便处理"''

在此处输入图片描述

答案4

这是一个适用于 LuaLaTeX 和 XeLaTeX 的解决方案。请检查屏幕截图下方的代码:您会注意到绝对没有需要完成才能达到预期结果。这是因为 LuaLaTeX 和 XeLaTeX 使用“直”撇号(单引号)自动地如果正在使用等宽字体(就像 的情况一样\texttt)。无论是否fontspec加载了该包,情况都是如此。

在此处输入图片描述

% !TEX TS-program = lualatex   %% or xelatex
\documentclass{article}
\begin{document}
\section{abc'def \texttt{abc'def} abc'def}

abc'def \texttt {abc'def} abc'def
\end{document}

相关内容