Babel 和 hyperref 阻止对 \LaTeX 徽标进行更改

Babel 和 hyperref 阻止对 \LaTeX 徽标进行更改

我曾经复制过 \LaTeX 命令的定义,将其作为参数,以便\renewcommand{}{}将其调整为我使用的字体。我注意到我的重新定义很长时间都没有效果,我将其缩小到是由于两个都 babelhyperref正在加载。

在这篇 MWE 中,我改变了原本的 \kern -.36em以便\kern -.99em更改清晰可见。加载babelhyperref后,\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}

在此处输入图片描述

添加

babel3.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}

相关内容