[french]{babel}
(又名frenchb
)与某些其他软件包不兼容,例如,因为它会尝试在分号前tikz
插入。\thinspace
为了让这两个运行良好,你必须调用\shorthandoff{;}
该文档。
现在我有一个使用 的包tikz
,我想在本地禁用 的分号babel
,而不是为整个文档禁用它。我可以破解.sty
包的 来做到这一点,因为我知道我正在使用frenchb
,但我宁愿做一些干净且可移植的事情。
有没有一种方法可以测试我的包是否frenchb
已加载并在本地禁用分号管理babel
,这样包就不会被黑客入侵?
编辑:
马丁的解决方案通常给我如下结论:
\RequirePackage{ifthen}
\newcommand{\@babel@loaded}{0}
\AtBeginDocument{\@ifpackageloaded{babel}
{\renewcommand{\@babel@loaded}{1}}
{\renewcommand{\@babel@loaded}{0}}
}
\newcommand{\somecommandusingsemicolon}{
\ifthenelse{\@babel@loaded=1}{\shorthandoff{;}}{}
% code with semi-colon here
}
在 tikz 的具体情况下:
\AtBeginDocument{\@ifpackageloaded{babel}
{%
\g@addto@macro\tikz@installcommands{%
\shorthandoff{;}%
}
\g@addto@macro\tikz@uninstallcommands{%
\shorthandon{;}%
}
}
{\relax}
}
答案1
您可以使用内部 LaTeX 宏\@ifpackageloaded
来测试包是否已加载:
\@ifpackageloaded{<name>}{<true>}{<false>}
还有:
\@ifpackagewith{<name>}{<option-list>}{<true>}{<false>}
\@ifpackagelater{<name>}{<date YYYY/MM/DD>}{<true>}{<false>}
有关更多宏,请参阅链接的文档LaTeX 内部命令的文档参考?。
在这种情况下,tikz
最好将您的代码添加到宏\tikz@installcommands
和中\tikz@uninstallcommands
。第一个在开始时执行tikzpicture
,并启用tikz
仅在那里定义的所有命令,后者在节点内容开始时执行,并将定义更改回正常状态。这样,您就可以在节点内使用法语文本。
您可以使用以下命令向宏添加代码:
\AtBeginDocument{\@ifpackageloaded{babel}{%
\g@addto@macro\tikz@installcommands{%
\shorthandoff{;}%
}%
\g@addto@macro\tikz@uninstallcommands{%
\shorthandon{;}%
}%
}{}
我只是猜测这与\shorthandon
是相反的\shorthandoff
。