我正在尝试定义一个自定义制表环境,该环境允许我将后续文本行与先前生成的块中的元素对齐,不能在制表环境中。到目前为止,这是我得到的:
\documentclass{article}
\usepackage[savepos]{zref}
\newenvironment{nstabbing}
{\setlength{\topsep}{0pt}%
\setlength{\partopsep}{0pt}%
\tabbing}
{\endtabbing\setcounter{tabstop}{0}}
\newcounter{tabstop}
\newcommand{\align}{%
\stepcounter{tabstop}%
\expandafter\zsavepos{stop\thetabstop}%
}
\begin{document}
First{\align} I have{\align} something{\align} which sets{\align} the alignment {\align}points.
\begin{nstabbing}
\hspace*{-\oddsidemargin}\hspace{-1in}\hspace{\zposx{stop1} sp}\=%
\hspace{-\zposx{stop1} sp}\hspace{\zposx{stop2} sp}\=%
\hspace{-\zposx{stop2} sp}\hspace{\zposx{stop3} sp}\=%
\hspace{-\zposx{stop3} sp}\hspace{\zposx{stop4} sp}\=%
\hspace{-\zposx{stop4} sp}\hspace{\zposx{stop5} sp}\=%
\kill
\>Some\>thing\>using\>those\>alignment points.\\
\end{nstabbing}
\end{document}
笔记:为了实现此 MWE,我用简单的文本替换了生成对齐点的块,以尽量减少 MWE 所需的包数量。将此块移动到制表环境中不是在实际使用中是可能的。
这可行,但手动构建终止行过于复杂,尤其是当制表位数量增加时(在某些用例中我可能最多有 20 个左右)。我想要做的是将其自动化,以便它可以成为自定义环境定义的一部分。
我认为,根据计数器的当前值,我知道需要定义多少个制表位以及环境启动时它们的名称是什么。然后我需要做的是以某种方式循环遍历位置来定义每个位置。有人对我如何修改定义以使其自动执行此操作tabstop
有什么建议吗?nstabbing
答案1
这是 的不同定义\align
(我建议使用不同的名称,因为\align
被 所采用amsmath
),此外还有一个宏,如果您愿意\setstops
,可以将其添加到 的定义中。nstabbing
\documentclass{article}
\usepackage[savepos]{zref}
\newenvironment{nstabbing}
{\setlength{\topsep}{0pt}%
\setlength{\partopsep}{0pt}%
\tabbing}
{\endtabbing\setcounter{tabstop}{0}}
\newcounter{tabstop}
\makeatletter
\newcommand{\AL}{%
\@bsphack
\stepcounter{tabstop}%
\expandafter\zsavepos{stop\thetabstop}%
\@esphack
}
\newcommand{\setstops}{%
\gdef\nstabbing@stops{%
\hspace*{-\oddsidemargin}\hspace{-1in}%
\hspace{\zposx{stop1} sp}\=%
}%
\count@=\@ne
\loop\ifnum\count@<\value{tabstop}%
\begingroup\edef\x{\endgroup
\noexpand\g@addto@macro\noexpand\nstabbing@stops{%
\noexpand\hspace{-\noexpand\zposx{stop\the\count@} sp}%
\noexpand\hspace{\noexpand\zposx{stop\the\numexpr\count@+1} sp}\noexpand\=%
}%
}\x
\advance\count@\@ne
\repeat
\nstabbing@stops\kill
}
\makeatother
\begin{document}
First \AL I have \AL something \AL which sets \AL the alignment \AL points.
\begin{nstabbing}\setstops
\>Some\>thing\>using\>those\>alignment points.\\
\end{nstabbing}
\end{document}