我曾经复制过 \LaTeX 命令的定义,将其作为参数,以便\renewcommand{}{}
将其调整为我使用的字体。我注意到我的重新定义很长时间都没有效果,我将其缩小到是由于两个都 babel
且hyperref
正在加载。
在这篇 MWE 中,我改变了原本的 \kern -.36em
以便\kern -.99em
更改清晰可见。加载babel
和hyperref
后,\LaTeX
徽标看起来没有变化:
\documentclass{article}
\usepackage{babel}
\usepackage{hyperref}
\makeatletter
\renewcommand{\LaTeX}{L\kern -.99em{\sbox \z@ T\vbox to\ht \z@ {\hbox {\check@mathfonts \fontsize \sf@size \z@ \math@fontsfalse \selectfont A}\vss }}\kern -.15em\TeX}
\makeatother
\begin{document}
\LaTeX
\end{document}
删除任意一个包后,输出如下:
我的问题是,如何\LaTeX
同时加载babel
和重新定义徽标hyperref
?
答案1
解释在babel.sty
667 \bbl@trace{Encoding and fonts}
668 \newcommand\BabelNonASCII{LGR,X2,OT2,OT3,OT6,LHE,LWN,LMA,LMC,LMS,LMU,PU,PD1}
669 \newcommand\BabelNonText{TS1,T3,TS3}
670 \let\org@TeX\TeX
671 \let\org@LaTeX\LaTeX
672 \let\ensureascii\@firstofone
673 \AtBeginDocument{%
674 \in@false
675 \bbl@foreach\BabelNonASCII{% is there a text non-ascii enc?
676 \ifin@\else
677 \lowercase{\bbl@xin@{,#1enc.def,}{,\@filelist,}}%
678 \fi}%
679 \ifin@ % if a text non-ascii has been loaded
680 \def\ensureascii#1{{\fontencoding{OT1}\selectfont#1}}%
681 \DeclareTextCommandDefault{\TeX}{\org@TeX}%
682 \DeclareTextCommandDefault{\LaTeX}{\org@LaTeX}%
683 \def\bbl@tempb#1\@@{\uppercase{\bbl@tempc#1}ENC.DEF\@empty\@@}%
684 \def\bbl@tempc#1ENC.DEF#2\@@{%
685 \ifx\@empty#2\else
686 \bbl@ifunset{T@#1}%
687 {}%
688 {\bbl@xin@{,#1,}{,\BabelNonASCII,\BabelNonText,}%
689 \ifin@
690 \DeclareTextCommand{\TeX}{#1}{\ensureascii{\org@TeX}}%
691 \DeclareTextCommand{\LaTeX}{#1}{\ensureascii{\org@LaTeX}}%
692 \else
693 \def\ensureascii##1{{\fontencoding{#1}\selectfont##1}}%
694 \fi}%
695 \fi}%
696 \bbl@foreach\@filelist{\bbl@tempb#1\@@}% TODO - \@@ de mas??
697 \bbl@xin@{,\cf@encoding,}{,\BabelNonASCII,\BabelNonText,}%
698 \ifin@\else
699 \edef\ensureascii#1{{%
700 \noexpand\fontencoding{\cf@encoding}\noexpand\selectfont#1}}%
701 \fi
702 \fi}
它基本上在文档开始时检查是否已加载某些“奇怪”的编码。在这种情况下,\LaTeX
(和\TeX
,就其价值而言)更改为特定于编码的命令,使用替换文本作为已加载\LaTeX
时有效的含义。babel.sty
这样做的原因并不难理解:LGR 编码在标准 ASCII 位置上有不同的字形,列表中的其他几个\BabelNonASCII
也一样。在本例中,hyperref
加载 PU 和 PD1。
解决方案:刷新 的含义\org@LaTeX
。但可能应该有一种不同的方法来在 级别上解决这个问题babel
,也许从列表中省略PU
和。PD1
\documentclass{article}
\usepackage{babel}
\usepackage{hyperref}
\makeatletter
\renewcommand{\LaTeX}{L\kern -.99em{\sbox \z@ T\vbox to\ht \z@ {\hbox {\check@mathfonts \fontsize \sf@size \z@ \math@fontsfalse \selectfont A}\vss }}\kern -.15em\TeX}
\let\org@LaTeX\LaTeX
\makeatother
\begin{document}
\LaTeX
\end{document}
添加
babel
3.62 版应该可以解决这个问题
答案2
hyperref 和 babel 共同努力使其成为一个特定于编码的命令,因此一种方法是简单地定义它(对于OT1
这里)或者对于T1
您正在使用它,或者TU
对于 XeLaTeX 或 LuaLaTeX 中的 Unicode 字体。
\documentclass{article}
\usepackage{babel}
\usepackage{hyperref}
\makeatletter
\DeclareTextCommand{\LaTeX}{OT1}{L\kern -.99em{\sbox \z@ T\vbox to\ht \z@ {\hbox {\check@mathfonts \fontsize \sf@size \z@ \math@fontsfalse \selectfont A}\vss }}\kern -.15em\TeX}
\makeatother
\begin{document}
\LaTeX
\end{document}