使用倾斜数字将文本变为斜体的命令

使用倾斜数字将文本变为斜体的命令

\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 中不受任何限制地工作。

  1. 创建cmti10.pl通过

    tftopl cmti10.tfm cmti10.pl
    
  2. 编辑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

  3. 创建cmtisl10.tfmcmtisl10.vf通过

    vptovf cmtisl10.vpl
    
  4. 现在您可以使用混合字体了:

    \documentclass{article}
    \font\1=cmtisl10
    \begin{document}
    \1 Italic text can be 01234567890 different.
    \end{document}
    
  5. 您可能希望为 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}
    

在此处输入图片描述

也可以看看:如何创建虚拟字体?

相关内容