![pdflatex 缩放逐字环境中数学符号 (∃, ∀) 的打字机字体](https://linux22.com/image/365616/pdflatex%20%E7%BC%A9%E6%94%BE%E9%80%90%E5%AD%97%E7%8E%AF%E5%A2%83%E4%B8%AD%E6%95%B0%E5%AD%A6%E7%AC%A6%E5%8F%B7%20(%E2%88%83%2C%20%E2%88%80)%20%E7%9A%84%E6%89%93%E5%AD%97%E6%9C%BA%E5%AD%97%E4%BD%93.png)
我想在缩放的逐字环境中使用数学符号(例如 ∀ 和 ∃),使用打字机字体。适合数学符号 (∀、∃、→) 的打字机字体,例如在逐字环境中不适用于使用\scalefont
来自scalefnt
包的缩放逐字环境。而且我还想坚持使用 pdflatex(而不是 xetex)。
以下是基于此答案的测试用例:
\documentclass{article}
\usepackage[utf8]{inputenc}
\usepackage[T1]{fontenc}
\usepackage{pmboxdraw}
\usepackage{newunicodechar}
\usepackage{fancyvrb}
\usepackage{scalefnt}
\DeclareFontFamily{U}{cmtex}{}
\DeclareFontShape{U}{cmtex}{m}{n}{
<-> cmtex10
}{}
\newcommand{\cmtex}[1]{{%
\usefont{U}{cmtex}{m}{n}\symbol{#1}%
}}
\newcommand{\ttexists}{\cmtex{"15}}
\newcommand{\ttforall}{\cmtex{"14}}
\newunicodechar{∃}{\ifmmode\exists\else\ttexists\fi}
\newunicodechar{∀}{\ifmmode\forall\else\ttforall\fi}
\begin{SaveVerbatim}{AlignTest}
│∃∀∃∀∃∀∃∀∃∀∃∀∃∀∃∀│
│1234567812345678│
\end{SaveVerbatim}
\begin{document}
\UseVerbatim{AlignTest}
{\scalefont{0.75}
\UseVerbatim{AlignTest}
}
\end{document}
编译此程序时,我收到警告,例如:
LaTeX Font Warning: Font shape `T1/cmr/m/n' in size <7.5> not available
(Font) size <7> substituted on input line 32.
以下是我得到的结果:
仅当字体缩放时才会显示错误对齐。使用\makebox
可以解决对齐问题:
\newcommand{\ttexists}{\makebox[0pt][l]{\cmtex{"15}} }
\newcommand{\ttforall}{\makebox[0pt][l]{\cmtex{"14}} }
但这可能意味着角色之间的距离比预期的要近,因为它们一开始就没有正确的尺寸。
如何才能正确解决字体大小问题(以及由此产生的对齐问题)?
答案1
您可以使用软件包解决主要问题fix-cm
,使字体完全可缩放。但是,标准打字机字体使用的光学缩放会导致固定缩放会导致字符略窄。通过将字符装箱cmtex
,使字符与 中的字符一样宽并不困难。cmtt
\RequirePackage{fix-cm}
\documentclass{article}
\usepackage[utf8]{inputenc}
\usepackage[T1]{fontenc}
\usepackage{pmboxdraw}
\usepackage{newunicodechar}
\usepackage{fancyvrb}
\usepackage{scalefnt}
\DeclareFontFamily{U}{cmtex}{}
\DeclareFontShape{U}{cmtex}{m}{n}{
<-> cmtex10
}{}
\newcommand{\cmtex}[1]{{%
\ttfamily\makebox[0.5em]{%
\usefont{U}{cmtex}{m}{n}\symbol{#1}%
}%
}}
\newcommand{\ttexists}{\cmtex{"15}}
\newcommand{\ttforall}{\cmtex{"14}}
\newunicodechar{∃}{\ifmmode\exists\else\ttexists\fi}
\newunicodechar{∀}{\ifmmode\forall\else\ttforall\fi}
\begin{SaveVerbatim}{AlignTest}
│∃∀∃∀∃∀∃∀∃∀∃∀∃∀∃∀│
│1234567812345678│
\end{SaveVerbatim}
\begin{document}
\UseVerbatim{AlignTest}
{\scalefont{0.75}%
\UseVerbatim{AlignTest}
}
\end{document}
在 Computer Modern Mono 中,em 是字母宽度的两倍,因此我首先切换到它并使用 em 作为框宽度。
如果你使用\cmtex
其他等宽字体,为了安全起见,你可以这样做
\makebox[\fontcharwd\font`0]{...}
这将精确使用等宽字体中数字/字母的宽度。