\newgeometry
是geometry
软件包的一个不错的功能。我发现它在使用时不起作用(以及许多其他问题),\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
,现在可以直接替换\setkeys
包keyval
:
\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
使用babel
3.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}