我有一个文档,'
里面有很多字符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}