我想为复杂模板。我遇到了以下问题:
- 我希望有用户宏将内容存储在框中,然后由类代码中的模板显示这些内容
- 我必须测量这些盒子才能设置布局的尺寸
- 我希望我的布局位于文档类中,而不是文档源文件中
- 我希望能够使用用户宏将上述内容存储在我的文档源文件中
那可能吗?
举一个小例子,假设我想创建一个TikZ
足够大的框架来容纳用户提供的文本。我想要一些类似这样的内容:
文档类别:
...
\newsavebox{\titlebox}
\sbox{\titlebox}{\parbox{\5cm}{\UserProvidedText}}
\newlength\titleheight
\settototalheight\titleheight{\usebox{\titlebox}}
\begin{tikzpicture}[remember picture, overlay]
\draw (0,0) rectangle (5cm,\titleheight) {\UserProvidedText};
\end{tikzpicture}
文档来源:
%provide \UserProvidedText somehow
据我所知,documentclass 需要\UserProvidedText
在读取文档源之前了解(我假设 TeX 只是读取 documentclass,然后继续读取源的其余部分)。
答案1
文档类本身不应该产生任何输出,而这正是您的tikzpicture
环境试图做的。解决这个问题的一种方法是将该代码保存在命令中\AtBeginDocument
。例如,这是一个类文件,我将其命名为ipavlic.cls
:
\LoadClass{article}
\renewcommand{\title}[1]{\gdef\@title{#1}}
\RequirePackage{tikz}
\AtBeginDocument{
\begin{tikzpicture}[remember picture, overlay]
\draw ([xshift=1cm]current page.west) node[rectangle,text width=5cm,rotate=90] {\@title};
\end{tikzpicture}
}
该\LoadClass{article}
命令使该类基本上成为标准的“派生类” article.cls
;最好不要从头开始。:D
文章类为\title
命令提供了与我将其更新为完全相同的功能;我这样做只是为了向您展示它的功能。它将其输入保存在宏中\@title
(@
符号只是类/包内部宏的约定。它在某种程度上保护此文本不被意外覆盖。)宏\AtBeginDocument
保存其输入以便在之后立即执行\begin{document}
。
还要注意的是,它是 TikZ节点包含文本,而不是矩形。您无需将标题保存在框中,然后将其放入节点中 — TikZ 可能会为您处理该问题。
现在这里有一个使用这个闪亮的新类的 TeX 文件。
\documentclass{ipavlic}
\title{TikZ Placement of Title}
\usepackage{lipsum}
\begin{document}
\lipsum
\end{document}
这种实现的一个缺点是,由于它依赖于 TikZ 的remember picture
机制,所以您必须运行两次 LaTeX 才能将标题放在正确的位置。
另一种方法是更改在每页末尾执行的 shipout 例程。您的自定义例程会将所有规则和额外信息放在常规类型块之外。如果是我这样做,我会使用该pgfpages
包,但我确信有开销更少的方法。