\newgeometry 不适用于土耳其语 babel 包

\newgeometry 不适用于土耳其语 babel 包

\newgeometrygeometry软件包的一个不错的功能。我发现它在使用时不起作用(以及许多其他问题),\usepackage[turkish]{babel}并出现许多错误,指出:

缺少插入 \endcsname...

这似乎是土耳其语 Babel 中的一个错误,它会在每个“=”符号旁边插入空格。我找到了一种解决方法:

\shorthandoff{=}
\newgeometry{top=1cm}
\shorthandon{=}

有没有更好的想法来实现这个功能?

答案1

\includegraphics正如您在上述评论中所要求的那样,提供解决方案。

在序言中添加以下几行:

\usepackage{etoolbox}
\let\oldincludegraphics\includegraphics
\renewcommand{\includegraphics}[2][]{%
  \oldincludegraphics[#1]{#2}%
  \shorthandon{=}%
  }
\pretocmd{\includegraphics}{\shorthandoff{=}}{}{}

我们首先重新定义\includegraphics在它后面添加\shorthandon{=},然后通过包\pretocmd中的命令etoolbox\includegraphics在它后面加上前缀\shorthandoff{=}

完成 MWE

\documentclass[]{article}
\usepackage[turkish]{babel}
\usepackage{graphicx}

\usepackage{etoolbox}
\let\oldincludegraphics\includegraphics
\renewcommand{\includegraphics}[2][]{%
  \oldincludegraphics[#1]{#2}%
  \shorthandon{=}%
  }
\pretocmd{\includegraphics}{\shorthandoff{=}}{}{}

\begin{document}

\includegraphics[width=4cm]{example-image-a}

\end{document} 

输出:

在此处输入图片描述

答案2

\usepackage[turkish]{babel}使=活动。这会干扰键值解析器,因为它们通常假设语法字符=,具有通常的 catcode(other=12)。官方方法确实是使用

\shorthandoff{=}
% stuff that does not expect an active `=', e.g.
\newgeometry{top=1cm}
\shorthandon{=}

包裹keyval\kvsetkeys

包 提供了一种更舒适的方式kvsetkeys。它的键值解析器就是为此而编写的turkish.ldf。因此,它支持键值列表中的活动语法字符。包定义了\kvsetkeys,现在可以直接替换\setkeyskeyval

\usepackage{keyval,kvsetkeys}
\let\setkeys\kvsetkeys

包裹xkeyval

该包直接重新定义并扩展\setkeys

\usepackage{xkeyval}

当 处理的键值列表支持活动等号时\setkeys

兼容性

xkeyval还会改变更多东西,例如包和类选项的解析,即使对于不使用或不了解的包也是如此xkeyval。因此,我考虑采用侵入性较小的解决方案kvsetkeys

但是,即使xkeyval可能由类或其他包加载,这两种解决方案也可以轻松协作。诀窍是尽早使用第一种方法:

\RequirePackage{keyval,kvsetkeys}
\let\setkeys\kvsetkeys

% classes and packages that might load xkeyval
\documentclass{...}

% packages in any order, e.g. 
\usepackage{geometry}
\usepackage[turkish]{babel}
\usepackage{graphicx}

\begin{document}

% then the following works without `\shorthandoff{=}`:
\newgeometry{top=1cm}
\includegraphics[width=\linewidth]{...}

kvsetkeys然后,包默认支持活动等号,或者xkeyval在稍后加载的情况下支持。

答案3

使用babel3.9(如果您不使用它,请升级,因为它修复了大量错误):

\usepackage[turkish,shorthands=off]{babel}

或者如果你:想要!

\usepackage[turkish,shorthands=:!]{babel}

土耳其风格最近也升级了。新手册解释了如何处理=

答案4

不要使用\shorthandon{=}。使用以下代码,似乎没有问题。

\documentclass[demo]{article}
\usepackage[turkish]{babel}
\usepackage[utf8]{inputenc}
\usepackage[top=2cm]{geometry}
\usepackage{graphicx}
\usepackage{lipsum}
\begin{document}
\shorthandoff{=}
\newgeometry{top=1cm}
\section{ğüşiöç}
\lipsum[1]
\includegraphics[scale=1]{}
\newgeometry{top=10cm}
\section{ĞÜŞİÖÇ}
\lipsum[2]
\includegraphics[scale=1]{}
\end{document}

相关内容