在类文件中,我已经设置(自动设置 PDF 信息字段):
\hypersetup{pdfinfo={Title={\@doctitle}, Author={\@docauthor}, Subject={\@docsubject}, Producer={LaTeX}, Version={\@docversion}, Date={\@docdate}, Institution={\@universityname}}}
但是,当我使用此类文件排版文档(在其他方面都运行良好)并查看 PDF 的文档属性时,我得到了各个字段的文字字符串“doctitle”、“docauthor”等。这表明 LaTeX 命令(在类文件的其他地方定义和使用)没有得到扩展。
我错过了什么?我需要转义 '\' (似乎是转义了 & 符号) 吗?
因此,\\@doctitle
,而不是\@doctitle
。或者 {} 的内容是否仅被视为文字字符串?如果是这样,我该如何实现我想要做的事情。
答案1
看来,你的类别代码是错误的@
。那么 TeX 将看不到该标记\@doctitle
,而是标记\@
、d
、o
、t
、i
、t
、t
、l
。e
第一个标记\@
被过滤掉(该命令设置了空间因子),字符串doctitle
保留下来。
在类文件中,的类别@
通常是“字母”,因此@
可以在命令名称中使用。也许您已通过 更改了它\makeatother
。
类别代码检查
@
您可以通过以下方式检查类别代码
\showthe\catcode`\@ % or \showthe\catcode64
这会抛出一个类似消息的错误,显示类别代码的数量。字母应该是 11。12 表示其他字符,效果为\makeatother
。
类别代码值也可以打印在屏幕和日志文件上:
\typeout{* Category code of @ = \the\catcode`\@}
但是,类别代码检查的位置比较棘手。它应该在标记化时\@doctitle
,不是执行时间。
例子:
<A>\def\macro{<B>\@doctitle...}
\@doctitle
在的定义时被标记化\macro
。因此为时<B>
已晚,应该\macro
在文档中稍后的某个地方执行 。
<A>
如果宏定义是“顶层”,而不是在宏或钩子内部,那么可能就是正确位置。例如:
<C>\AtBeginDocument{<A>\def\macro{<B>\@doctitle}}
然后<A>
就太晚了,因为的宏定义\macro
已经被标记为的参数\AtBeginDocument
。然后<C>
是更好的地方。