![如何制作按列排列的项目 ID 列表?](https://linux22.com/image/314448/%E5%A6%82%E4%BD%95%E5%88%B6%E4%BD%9C%E6%8C%89%E5%88%97%E6%8E%92%E5%88%97%E7%9A%84%E9%A1%B9%E7%9B%AE%20ID%20%E5%88%97%E8%A1%A8%EF%BC%9F.png)
我想列出不同组中项目的 ID 或任何属性。它应该看起来像这样:
Article group 1
Article 1 . . . . . . . . . . . . . . . . . . . . ID
Second article . . . . . . . . . . . . . . . . . ID
Group 2 Cat No 1 Cat No 2
Product . . . . . . . . . . . ID1 . . . . . . . . ID2
Another product . . . . . . . ID1 . . . . . . . . ID2
Article group 3 Cat No
Something . . . . . . . . . . . . . . . . . . . . ID
Other thing . . . . . . . . . . . . . . . . . . . ID
我尝试在制表环境中执行此操作。如果我不使用前导点,它就可以工作,但是 \dotfill 在制表环境中不起作用。
我也尝试使用列表环境,但我不知道如何正确对齐 ID 列。
这是我做的:
\documentclass[12]{article}
\begin{document}
\begin{list}{}{}
\item Article group 1
\end{list}
\begin{list}{}{}
\item Article 1~\dotfill~ID
\item Second article~\dotfill~ID
\end{list}
\begin{list}{}{}
\item Group 2
\end{list}
\begin{list}{}{}
\item Product~\dotfill~ID1~\dotfill~ID2
\item Another product~\dotfill~ID1~\dotfill~ID2
\end{list}
\begin{list}{}{}
\item Article group 3~\hfill~Cat No
\end{list}
\begin{list}{}{}
\item Something~\dotfill~ID
\item Other thing~\dotfill~ID
\end{list}
\end{document}
列未正确对齐。我曾想过将其制作成表格/表格,但在表格中我无法使用 \dotfill。
答案1
以下示例定义了宏\dotsfrom
和\dotsto
,它们在位置之间放置了虚线。位置是从zref-savepos
包的模块获取的zref
,该模块为\pdfsavepos
pdfTeX 的功能提供了一个接口,该功能在 LuaTeX 和 XeTeX 中也可用。第一次 LaTeX 运行将文件中的位置存储.aux
为参考,下一次运行将使用上一次运行的位置值。这需要两次 LaTeX 运行。
表格通过简单的线条宽度实现,并在列之间使用粘连来填充空间。通过和tabular*
设置点也可以在环境或列表中使用。\dotsfrom
\dotsto
tabbing
虚线使用了 的代码\@dottedtocline
,该代码在目录中使用,原因有二:
点之间的空间不像 中那么窄,
\dotfill
因此不太显眼。还可以通过重新定义 来配置空间\@dotsep
。代码使用
\leaders
而不是\cleaders
(\dotfill
)。因此,如果点位于同一个封闭框中,则它们垂直对齐。但是,这里情况并非如此。因此,所有点的封闭框都从 开始垂直对齐X坐标为零。
这个例子展示了这项技术。但我没有将低级宏包装在标记命令中,因为目标布局不太明确(对齐要求、太长的条目怎么办、有多少个类别、文章名称列是否可以使用未使用的类别列的空间、文章组是否独立,中间列可能有不同的位置、多页表……?)。
\documentclass{article}
\usepackage{zref-savepos}
\providecommand{\zsaveposx}{\zsavepos}
\newcounter{dotsfromto}
\renewcommand*{\thedotsfromto}{DFT@\the\value{dotsfromto}}
\newcommand*{\dotsfrom}{%
\stepcounter{dotsfromto}%
\leavevmode
\zsaveposx{\thedotsfromto f}%
}
\makeatletter
\newcommand*{\dotsto}{%
\leavevmode
\zsaveposx{\thedotsfromto t}%
\zref@refused{\thedotsfromto f}%
\zref@refused{\thedotsfromto t}%
\ifnum\zposx{\thedotsfromto t}>\zposx{\thedotsfromto f}\relax
\llap{%
\hbox to \zposx{\thedotsfromto t}sp{%
\kern\zposx{\thedotsfromto f}sp\relax
\leaders\hbox{$\m@th % from \@dottedtocline
\mkern\@dotsep mu\hbox{.}\mkern\@dotsep mu%
$}\hfill
}%
}%
\fi
}
\makeatother
\begin{document}
\noindent
\begin{tabular*}{\linewidth}{@{\extracolsep{\fill}}lcc@{}}
\bfseries Article group 1 & & Cat.~No.\\
Article 1\dotsfrom & & \dotsto ID\\
Second article\dotsfrom & &\dotsto ID\\[\normalbaselineskip]
\bfseries Group 2 & Cat.~No.~1 & Cat.~No.~2\\
Product\dotsfrom & \dotsto ID1\dotsfrom & \dotsto ID2\\
Another product\dotsfrom & \dotsto ID1\dotsfrom & \dotsto ID2
\\[\normalbaselineskip]
\bfseries Article group 3 & & Cat.~No.\\
Something\dotsfrom & & \dotsto ID\\
Other thing\dotsfrom & & \dotsto ID\\
\end{tabular*}
\end{document}
答案2
也许可以使用全宽表格 - 形式为tabularx
- 适合你:
\documentclass{article}
\usepackage{tabularx,array,booktabs}
\newcolumntype{L}{@{}X<{\dotfill}@{}}
\begin{document}
\begin{list}{}{}
\item Article group 1
\end{list}
\begin{list}{}{}
\item Article 1~\dotfill~ID
\item Second article~\dotfill~ID
\end{list}
\begin{list}{}{}
\item Group 2
\end{list}
\begin{list}{}{}
\item Product~\dotfill~ID1~\dotfill~ID2
\item Another product~\dotfill~ID1~\dotfill~ID2
\end{list}
\begin{list}{}{}
\item Article group 3~\hfill~Cat No
\end{list}
\begin{list}{}{}
\item Something~\dotfill~ID
\item Other thing~\dotfill~ID
\end{list}
\noindent
\begin{tabularx}{\linewidth}{ L L r@{} }
\toprule
\multicolumn{3}{@{}l}{Article group 1} \\
\midrule
\multicolumn{2}{L}{Article 1} & ID \\
\multicolumn{2}{L}{Second article} & ID \\
\bottomrule
\end{tabularx}
\noindent
\begin{tabularx}{\linewidth}{ L L r@{} }
\toprule
\multicolumn{3}{@{}l}{Group 2} \\
\midrule
Product & ID1 & ID2 \\
Another product & ID1 & ID2 \\
\bottomrule
\end{tabularx}
\noindent
\begin{tabularx}{\linewidth}{ L L r@{} }
\toprule
\multicolumn{2}{@{}l}{Article group 3} & \llap{Cat No} \\
\midrule
\multicolumn{2}{L}{Something} & ID \\
\multicolumn{2}{L}{Other thing} & ID \\
\bottomrule
\end{tabularx}
\end{document}
水平线只是为了展示booktabs
。
请注意,这些结构不会跨越页面边界,而您的list
s 则会。