我想给一个字符加上划线 (/bar)。但是,根据此字符的字体粗细和字体大小,我希望上划线具有不同的粗细 – 它应该随字体大小和字体粗细缩放。
我怎样才能做到这一点?
理想情况下,上划线和字符之间的距离也应是(自动)可配置的。较小的字符相对而言需要字符和上划线之间的空间要比较高的字符大。
背景
我们的物理实验称为 PANDA,在\overline
P 的顶部有一个
。虽然这对于普通文本来说看起来还不错,但一旦 PANDA 以粗体打印或以更大的文本尺寸(部分标题)打印,它就会开始看起来不对劲。
(第一个总是一个\overline{P}
,第二个总是一个\bar{P}
。以下是 ShareLatex 代码(第 1 部分)。
尝试
我四处搜索,摆弄了一番,但没有找到我想要的结果。在上述 ShareLatex 文件的第 2 部分,我总结了我发现的三种主要可能性。
在 fntguide (http://mirrors.ctan.org/macros/latex/base/fntguide.pdf,第 8 页)我还发现了保存当前字体样式的内部宏。\f@series
负责字体粗细。不过,我对 TeX 了解太少,无法\if
围绕这个变量编写使用宏。
答案1
这是一条上划线,其粗细取决于粗细:它检查是否\f@series
包含b
,在本例中,它增加了少量的粗细。使用下面代码中的值,标准规则是 0.04em,对于粗体字,则变为 0.06em;更改0.02
定义中的\panda@check@b
以适应您的口味。
\documentclass{article}
\DeclareRobustCommand{\panda}{\oP ANDA}
\newcommand{\oP}{%
\leavevmode
\vbox{\offinterlineskip
\halign{%
##\cr
\kern.04em % start a bit to the right
\leaders\hrule height \pandarulewidth\hfill % the rule
\kern.1em % stop a bit to the left
\cr
\noalign{\vskip0.1ex}
P\cr
}%
}%
\sbox0{P\kern0ptA}%
\sbox2{PA}%
\dimen0=\wd2
\advance\dimen0 -\wd0
\kern\dimen0 % the kern between P and A
}
\makeatletter
\def\pandarulewidth{%
\dimexpr0.04em+0\panda@add em\relax
}
\def\panda@add{\expandafter\panda@check@b\f@series b.\@nil}
\def\panda@check@b#1b#2\@nil{\if.#2\else0.02\fi} % adjust at will
\makeatother
\begin{document}
PANDA
\panda
\textbf{\panda}
\LARGE\panda
\end{document}
这是一个更复杂的版本,也适用于倾斜的字体。
\documentclass{article}
\DeclareRobustCommand{\panda}{\oP ANDA}
\makeatletter
\newcommand{\oP}{%
\leavevmode
\vbox{\offinterlineskip
\edef\panda@slant{\strip@pt\fontdimen1\font}%
\halign{%
##\cr
\kern\panda@slant\fontcharht\font`P
\kern.04em % start a bit to the right
\leaders\hrule height \pandarulewidth\hfill % the rule
\kern.1em % stop a bit to the left
\kern-\fontcharic\font`P
\cr
\noalign{\vskip0.1ex}
P\cr
}%
}%
\sbox\z@{P\kern0ptA}%
\sbox\tw@{PA}%
\dimen\z@=\wd\tw@
\advance\dimen\z@ -\wd\z@
\kern\dimen\z@ % the kern between P and A
}
\def\pandarulewidth{%
\dimexpr0.04em+0\panda@add em\relax
}
\def\panda@add{\expandafter\panda@check@b\f@series b.\@nil}
\def\panda@check@b#1b#2\@nil{\if.#2\else0.02\fi} % adjust at will
\makeatother
\begin{document}
\panda
\textit{\panda}
\textbf{\panda}
\itshape\LARGE\panda
\end{document}
另一个改进是考虑到无衬线字体的侧边距:
\documentclass{article}
\DeclareRobustCommand{\panda}{\oP ANDA}
\makeatletter
\newcommand{\oP}{%
\leavevmode
\vbox{\offinterlineskip
\edef\panda@slant{\strip@pt\fontdimen1\font}%
\halign{%
##\cr
\kern\panda@slant\fontcharht\font`P
\kern.04em % start a bit to the right
\edef\sfdefault{\sfdefault}% sorry for the hack
\ifx\f@family\sfdefault \kern.06em\fi % some more kerning for sans serif
\leaders\hrule height \pandarulewidth\hfill % the rule
\kern.1em % stop a bit to the left
\kern-\fontcharic\font`P
\cr
\noalign{\vskip0.1ex}
P\cr
}%
}%
\sbox\z@{P\kern0ptA}%
\sbox\tw@{PA}%
\dimen\z@=\wd\tw@
\advance\dimen\z@ -\wd\z@
\kern\dimen\z@ % the kern between P and A
}
\def\pandarulewidth{%
\dimexpr0.04em+0\panda@add em\relax
}
\def\panda@add{\expandafter\panda@check@b\f@series b.\@nil}
\def\panda@check@b#1b#2\@nil{\if.#2\else0.02\fi} % adjust at will
\makeatother
\begin{document}
\panda
\textit{\panda}
\textbf{\panda}
\LARGE\textit{\panda}
\textsf{\panda}
\end{document}