每次遇到新页面时,我都需要定义一个宏或执行一些特殊操作。从某种意义上说,我想对 tikzpictures 进行“编号”,但让同一页上的所有 tikzpictures 都包含相同的编号。(它比这更复杂,但这只是一个简单的例子)
基本上我想要做的就是在每个新页面的开头定义一个宏。我将在我的 tikzpictures 中使用该宏来做一些特殊的事情,它们可能根据某些因素删除宏(这就是为什么我需要在每个新页面上设置它以便在每个页面上重置它)。
在执行我的文档中的任何 tex 之前,需要在每个新页面开始时定义宏。
基本上,我想避免必须为每个新页面自己在文档中添加宏(这很难控制并且会使事情变得混乱)。
我的情况:我的文档中分散着几张 tikspictures,但有些位于同一页面上。
我希望页面上的第一个内容得到特殊处理(例如添加标题)。但我可能会添加或删除文本,可能改变顺序但我不想更新代码。
例如,
-New Page
Text
Img1 *
Img2
-New Page
Img3 *
Text
Img4
Img5
-New Page
Img6 *
因为 Img 1 3 和 6 是页面上的第一张,所以我想对它们做一些事情。但我不想对此进行硬编码,因为它可能很容易改变(当我添加文本时,它可能会将一些图像推到新页面上,即
-New Page
Text
Img1 *
-New Page
Img2
Img3 *
Text
Img4
-New Page
Img5
Img6 *
并注意到 * 与页面上的第一个图像不对应(就像我想要的那样)。也就是说,如果您对我想要做的事情进行硬编码,就会发生这种情况。
此外,因为 tex 首先必须计算图像 bbox 来确定它是否在当前页面上,所以我需要可以工作的代码因为我的图片取决于它们是否是页面上的第一张图片。
我的“特殊”操作仅使图像水平居中,因此不会影响布局。
问题源于
我正在尝试简化和自动化该过程。我需要按照我描述的方式应用主从模式。页面上的第一张图片应该采用主样式,其余图片应该采用从样式但不是硬编码,因为它导致了我上面给出的问题。
(请注意 Jake 的答案是如何对主服务器和从服务器进行硬编码的。如果您添加将某些图像推送到新页面的文本,这会导致严重问题。(因为页面上的第一个图像应该是主服务器,但通过硬编码,您可以将从服务器作为第一个图像)
答案1
您仍然需要分两次完成此操作。
考虑一个占用一两页纸的长段落。全部段落中的宏是充分在考虑换行之前进行扩展,并且只有在决定换行之后才会触发输出例程来考虑分页。
分页不会影响换行决定,换行也不会影响宏扩展。因此,宏扩展的任何部分都不会受到分页的影响。
您可以做的是让每张图片都做一个\label{uniquelabel}
然后它可以(在稍后运行乳胶时)检查\pageref{uniquelable}
并\pageref{the-label-of-previous-figure}
查看您是否是该页面上的第一个。
因此在下面的例子中,每一页上的第一个示例都会得到修改后的格式,即“第一页”
\documentclass{article}
\textheight15\baselineskip
\newcounter{pcount}
\makeatletter
\newenvironment{test}{%
\refstepcounter{pcount}%
\par\bigskip
\edef\this{\expandafter\expandafter\expandafter\@secondoftwo\csname r@x:\thepcount\endcsname\@empty}%
\ifx\this\@empty
\typeout{first pass}%
\def\format{}%
\else
\advance\c@pcount\m@ne
\edef\prev{\expandafter\expandafter\expandafter\@secondoftwo\csname r@x:\thepcount\endcsname\@empty}%
\advance\c@pcount\@ne
\ifx\prev\this
\def\format{}%
\else
\def\format{first on page! }%
\fi
\fi
\begin{tabular}{|l|}\hline \format test:\label{x:\thepcount} \thepcount\\\hline}
{\\\hline\end{tabular}
\bigskip}
\makeatother
\begin{document}
test
\begin{test}one\\two\end{test}
\begin{test}aaa\\bbb\\ccc\end{test}
\begin{test}aaa\\bbb\\ccc\end{test}
more text
\begin{test}red\\green\\blue\end{test}
\begin{test}1\\2\\2\\4\end{test}
more text
\begin{test}black\\white\\\end{test}
\begin{test}a\\b\\c\\d\end{test}
\end{document}
答案2
这是一个简单的 TeX 解决方案。我不知道它是否能帮助你理解 David Carlisle 的代码。
我仍然使用 LaTeX 的文档环境来测试代码,但这无关紧要。
\documentclass{article}
\newcount\uiycount
\newwrite\uiyout
\def\uiycar#1#2\nil{#1}
\def\uiyenv#1{%
\global\advance\uiycount by1
\def\currtag{\number\uiycount\number\count0}%
\par\bigskip
\def\proclaim{}%
\immediate\write\uiyout{%
\noexpand\expandafter\gdef\noexpand\csname
uiy-\currtag\noexpand\endcsname{\the\count0}%
}%
\expandafter\expandafter\expandafter
\ifx\expandafter\uiycar\csname uiy-\currtag\endcsname\nil\relax
\typeout{first pass; please rerun.}%
\else
\edef\curr{\csname uiy-\currtag\endcsname}%
\advance\uiycount by-1
\edef\prev{\csname uiy-\currtag\endcsname}%
\advance\uiycount by1
\ifx\prev\curr\else
\def\proclaim{first on page! }%
\fi
\fi
#1\relax
}
\def\enduiyenv#1{#1\relax}
\openin\uiyout=\jobname.uiy
\ifeof\uiyout\else
\input\jobname.uiy
\fi
\immediate\openout\uiyout=\jobname.uiy
% Tests
\begin{document}
Testing \ldots
% You can define \startstuff to be anything you want, or just use
% the stuff being defined in \startstuff directly as argument of
% \uiyenv (see example below):
\def\startstuff{%
\begin{tabular}{|l|}\hline
\proclaim test: \number\uiycount\\\hline
}
% Similarly, you can define \endstuff to be anything you want, or just use
% the stuff being defined in \endstuff directly as argument of
% \enduiyenv:
\def\endstuff{%
\\\hline\end{tabular}\bigskip
}
\uiyenv\startstuff one\\two\enduiyenv\endstuff
\uiyenv{%
\begin{tabular}{|l|}\hline
\proclaim test: \number\uiycount\\\hline
}
aaa\\bbb\\ccc
\enduiyenv{%
\\\hline\end{tabular}\bigskip
}
\uiyenv\startstuff aaa\\bbb\\ccc\enduiyenv\endstuff
\newpage
Next text \ldots
\uiyenv\startstuff red\\green\\blue\enduiyenv\endstuff
\uiyenv\startstuff 1\\2\\2\\4\enduiyenv\endstuff
\newpage
More text \ldots
\uiyenv\startstuff black\\white\\\enduiyenv\endstuff
\newpage
\uiyenv\startstuff a\\b\\c\\d\enduiyenv\endstuff
\end{document}