\textsl{}
我经常发现自己在里面\emph{}
或块中添加了很多内容,\textit{}
因为我发现斜体数字看起来太“炫耀”和“巴洛克风格”并且妨碍了可读性(我$$
在数字具有数学意义时使用它,但这种情况发生在技术性较差的文本中,如简历等)。
有人能帮我写一个renewcommand
自动化程序吗?或者更好的是,一个单独的低级命令,让\emph
、\itshape
和\textit
朋友选择倾斜而不是斜体来表示数字?我不太熟悉低级乳胶字体选择系统,也不太熟悉从普通字母中检测数字的方法。
编辑:我需要什么以及我想避免什么
\documentclass{article}
\begin{document}
He thought: '\emph{Why 1234567890 apples?}'
then he realized '\emph{ah yes, he has \textsl{1234567890} childs}'
\end{document}
给出:
我发现 2、3、4 和 7 的斜体版本(第一个)看起来特别糟糕。
答案1
据我所知,由于您只是在编写文本,因此无需进行任何数学运算。此解决方案并不完美,但可以为您提供一个起点。
此解决方案将所有数字替换为\textsl{…}
版本。如果您希望任何数字不被替换,则必须将其括在 中{…}
。
\documentclass{scrartcl}
\usepackage{xparse}
\ExplSyntaxOn
\NewDocumentCommand \italicize { m }
{ \nathdwek_italicize:n { #1 } }
\cs_new_protected:Npn \nathdwek_italicize:n #1
{
\tl_set:Nn \l_tmpa_tl { #1 }
\tl_map_inline:nn { 0123456789 }
{ \tl_replace_all:Nnn \l_tmpa_tl { ##1 } { \textsl { ##1 } } }
\textit { \tl_use:N \l_tmpa_tl }
}
\ExplSyntaxOff
\begin{document}
I want this with upright numbers. Like 1, or 2 or 123.\par
\emph{I want this with italics numbers. Like 1, or 2 or 123.}\par
\italicize{I want this with slanted numbers. Like 1, or 2 or 123.}
\end{document}
答案2
与 Manuel 的非常相似,但是使用正则表达式而不是映射:
\documentclass{scrartcl}
\usepackage{xparse,l3regex}
\ExplSyntaxOn
\NewDocumentCommand \italicize { m }
{ \nathdwek_italicize:n { #1 } }
\tl_new:N \l_nathdwek_text_tl
\cs_new_protected:Npn \nathdwek_italicize:n #1
{
\tl_set:Nn \l_nathdwek_text_tl { #1 }
\regex_replace_all:nnN { (\d+) } { \c{textsl}\cB\{\1\cE\} } \l_nathdwek_text_tl
\textit { \tl_use:N \l_nathdwek_text_tl }
}
\ExplSyntaxOff
\begin{document}
I want this with upright numbers. Like 1, or 2 or 123.\par
\emph{I want this with italics numbers. Like 1, or 2 or 123.}\par
\italicize{I want this with slanted numbers. Like 1, or 2 or 123.}
\end{document}
搜索表达式
(\d+)
表示“找到任意一个或多个数字的簇并记住它”;替换表达式
\c{textsl}\cB\{\1\cE\}
意思是“用 替换,\textsl{
后面跟着你找到的内容(\1
位),后面跟着}
。
一个优点是123
将被\textsl{123}
取代\textsl{1}\textsl{2}\textsl{3}
。
答案3
Manuel 和 egreg 提供的搜索和替换解决方案相当棘手。这些解决方案的限制是,你只能在命令的参数中更改文本字体,而不能进行任何特殊的宏扩展。
然而,解决这个问题的直接方法是使用混合字体。混合字体可以在现代 TeX 引擎(如 XeTeX 和 LuaTeX)中动态设置,但虚拟字体机制在旧 TeX 引擎中也可用。
我将提供一个 XeTeX 解决方案以及一个旧的虚拟字体解决方案,将 LuaTeX 解决方案留给 LuaTeX 专家。
1. XeTeX 解决方案
也可以看看:XeTeX 中特定字符的字体选择
% !TeX program = xelatex
\documentclass{article}
\XeTeXinterchartokenstate=1
\chardef\CharNormal=0
% Test for old and new versions of the latex kernel
\ifx\e@alloc@intercharclass@top\@undefined
\chardef\CharBound=255
\else
\chardef\CharBound=\e@alloc@intercharclass@top % 4095 for new version of XeTeX engine
\fi
\newXeTeXintercharclass\CharNumbers
\XeTeXcharclass`0=\CharNumbers
\XeTeXcharclass`1=\CharNumbers
\XeTeXcharclass`2=\CharNumbers
\XeTeXcharclass`3=\CharNumbers
\XeTeXcharclass`4=\CharNumbers
\XeTeXcharclass`5=\CharNumbers
\XeTeXcharclass`6=\CharNumbers
\XeTeXcharclass`7=\CharNumbers
\XeTeXcharclass`8=\CharNumbers
\XeTeXcharclass`9=\CharNumbers
\newtoks\TokSetfont
\makeatletter
\TokSetfont={\begingroup
\ifnum\strcmp{\f@shape}{\itdefault}=0
\slshape
\fi}
\makeatother
\XeTeXinterchartoks\CharNormal\CharNumbers=\TokSetfont
\XeTeXinterchartoks\CharBound\CharNumbers=\TokSetfont
\XeTeXinterchartoks\CharNumbers\CharNormal={\endgroup}
\XeTeXinterchartoks\CharNumbers\CharBound={\endgroup}
\usepackage{listings,color}
\begin{document}
\textit{Italic text can be 01234567890 different.}
\begin{itshape}
Text mode 123 in math equation:
\[
xyz1234 \ne \textit{xyz1234}
\]
Complex macro expansion:
\def\foo{[123\noexpand\bar456]}
\def\bar{hello 789 hello}
\foo
\end{itshape}
\begin{lstlisting}[basicstyle=\itshape\color{blue}]
There is not any restriction for the mixed 1234567890 font:
qwerty001 bar456
\end{lstlisting}
\end{document}
2. 使用虚拟字体
也可以创建虚拟字体来混合cmti*
字体cmsl*
。虽然这要复杂得多,但虚拟字体可以在 TeX 中不受任何限制地工作。
创建
cmti10.pl
通过tftopl cmti10.tfm cmti10.pl
编辑
cmti10.pl
,在文件开头添加这些字体映射:(MAPFONT D 0 (FONTNAME cmti10)) (MAPFONT D 1 (FONTNAME cmsl10)) (CHARACTER C 0 (MAP (SELECTFONT D 1) (SETCHAR C 0))) (CHARACTER C 1 (MAP (SELECTFONT D 1) (SETCHAR C 1))) (CHARACTER C 2 (MAP (SELECTFONT D 1) (SETCHAR C 2))) (CHARACTER C 3 (MAP (SELECTFONT D 1) (SETCHAR C 3))) (CHARACTER C 4 (MAP (SELECTFONT D 1) (SETCHAR C 4))) (CHARACTER C 5 (MAP (SELECTFONT D 1) (SETCHAR C 5))) (CHARACTER C 6 (MAP (SELECTFONT D 1) (SETCHAR C 6))) (CHARACTER C 7 (MAP (SELECTFONT D 1) (SETCHAR C 7))) (CHARACTER C 8 (MAP (SELECTFONT D 1) (SETCHAR C 8))) (CHARACTER C 9 (MAP (SELECTFONT D 1) (SETCHAR C 9)))
并将文件另存为
cmtisl10.vpl
。创建
cmtisl10.tfm
并cmtisl10.vf
通过vptovf cmtisl10.vpl
现在您可以使用混合字体了:
\documentclass{article} \font\1=cmtisl10 \begin{document} \1 Italic text can be 01234567890 different. \end{document}
您可能希望为 NFSS 中的混合字体定义一种新的字体形状。当然,还有更多不同的大小需要处理(重复步骤 1 至 3)。
\documentclass{article} \DeclareFontShape{OT1}{cmr}{m}{itsl}{ <-8> cmtisl7 <8-9> cmtisl8 <9-10> cmtisl9 <10-12> cmtisl10 <12-> cmtisl12 }{} \newcommand\itslshape{\fontshape{itsl}\selectfont} \DeclareTextFontCommand\textitsl{\itslshape} \usepackage{listings,color} \begin{document} \textitsl{Italic text can be 01234567890 different.} \begin{lstlisting}[basicstyle=\itslshape\color{blue}] There is not any restriction for the mixed 1234567890 font: qwerty001 bar456 \end{lstlisting} \end{document}
也可以看看:如何创建虚拟字体?