Documentclass 用户宏

Documentclass 用户宏

我想为复杂模板。我遇到了以下问题:

  1. 我希望有用户宏将内容存储在框中,然后由类代码中的模板显示这些内容
  2. 我必须测量这些盒子才能设置布局的尺寸
  3. 我希望我的布局位于文档类中,而不是文档源文件中
  4. 我希望能够使用用户宏将上述内容存储在我的文档源文件中

那可能吗?

举一个小例子,假设我想创建一个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包,但我确信有开销更少的方法。

相关内容