按照此回答是否可以在 LaTeX 中使用某种国际化?我正在建立自己的词典。
编译文件时出现此错误:
! Use of \if doesn't match its definition.
我想这就是为什么我命名了一个学期作为if_foreign_buyer
\def \if_foreign_buyer{You can only...}
删除启动if
即可解决问题
除了不以 if
?
此外,我想用下划线开头所有术语_
,以便我可以使用命令抓取它们sed
并根据主文件中的术语创建字典。
这似乎也是不允许的。真的吗?
答案1
这里的问题是,_
宏名称中不允许使用非字母,例如,不能将其视为名称的一部分。任何在和之后的\def\themacro
文本{
视为参数文本必须与实际输入相匹配。使用您的代码,您将 TeX 原语(重新)定义\if
为一个宏,该宏等待并_foreign_buyer
在其后删除并将其替换为You can only...
。然后第一次使用\if
(在包或 LaTeX 核心宏内)而后面没有跟随时_foreign_buyer
会引发 TeX 错误。
你不应该使用_
宏名称的一部分,如果你这样做,你需要确保它们具有正确的猫码,即11”信",在定义和使用时。这可以使用\catcode`\_=11\relax
但不推荐,并且会破坏依赖_
于数学模式下下标命令的默认含义的代码。
if
在宏名称前面有不是问题,完全没问题。唯一的限制是\ifxxx
s ,由 定义\newif
,假定它们以 开头if
。然后总是去掉前两个字母以产生\xxxtrue
和\xxxfalse
。但这不会影响宏定义。
答案2
_
如果你在命令名称中使用,几乎没有什么不好的,只要你有
\catcode`\_=11
在开始定义这些命令之前,永远不要恢复选择。
_
您甚至可以通过添加继续在数学公式中使用
\mathcode`\_=\string"8000
\begingroup
\catcode`\_=\active
\global\let_\sb
\endgroup
然而,这样的命名方案是非标准的,绝对不值得推荐。对于某些babel
语言来说,它甚至可能会出错。
我不知道如何
\command_with_underscore
将提高可读性
\NEcommand
这很容易搜索。
举个例子,只是为了说明这是如何工作的。
\documentclass{article}
% Start of document commands
\catcode`\_=11
\mathcode`\_=\string"8000
\begingroup
\catcode`\_=\active
\global\let_\sb
\endgroup
\newcommand{\foreign_buyer}{whatever}
\begin{document}
Here we use \foreign_buyer, and also a formula $a_{1}$.
\end{document}
以...开头的命令名\if
绝对不是好习惯,除非它是一个真实的条件,以 引入\newif
。
请注意,如果没有\catcode`\_=11
,当你说
\def\if_foreign_buyer{...}
你实际上(重新)定义了非常重要的原始命令\if
,这肯定会导致灾难任何文档。
注意:该命令\sb
由 LaTeX 内核定义\let\sb=_
,因此当修改下划线字符的类别代码时,其含义不会改变。因此它始终可以替代下划线字符。
在这个应用程序中,我们告诉 TeX_
在数学模式下应该像命令一样运行,它会扩展为\sb
,也就是说它会做正确的事情。但是,依赖于 的存在的宏_
会被欺骗,因此某些包或宏可能会失败(不常用,但我见过一些宏测试以下 的情况_
)。
答案3
使用连字符会更简单:
\documentclass{minimal}
\makeatletter
\@namedef{if-foreign-buyer}{You can only...}
\makeatother
\begin{document}
\csname if-foreign-buyer\endcsname
\end{document}
答案4
\documentclass{article}
\makeatletter
\let\mydef\@namedef
\let\myuse\@nameuse
\makeatother
\begin{document}
\mydef{foreign_buyer}{jfbu}
\mydef{foreign_seller}{egreg}
The foreign seller \myuse{foreign_seller} is definitely infinitely more of a
\TeX pert than the foreign buyer \myuse{foreign_buyer}.
\end{document}