我想知道是否有一种简单的方法可以让 LaTeX 输出两个列表:
- 包含和的页面
- 不包含图形和/或其他彩色对象的页面。
我想用彩色打印机(昂贵)打印彩色页面,其余页面则以黑白打印。我希望能够拥有一个 PDF 和两个带有 CSV 列表的 txt 文件,然后直接将其转储到打印对话框中。
如果这不容易做到,那么有没有办法修改图表列表格式,使其仅列出以逗号分隔的页面?这样我就可以用该 LOF 编译 PDF 的临时版本,然后将它们复制到文本文件中。但我不知道如何获得该组页码的补码。
我看见这个帖子建议手动执行或使用 PDFpages,但似乎没有什么定论。
更新
Andrey 在下面提供了一个输出 CSV 列表的不错解决方案。我现在意识到,对于我的论文来说,列表太长了,无法放入打印对话框中,而且我的打印地点说他们更喜欢两个单独的 PDF 文档。
因此,我想知道是否有可能整合所pdfpages
演示的方法这里这样它就可以接收 Andrey 方法生成的 CSV 列表,并使用它们创建另外两个 PDF 文件,一个是彩色页面,另一个是黑白页面。该方法如下,inputPDFfilename
完整 PDF 在哪里:
\documentclass{article}
\usepackage{pdfpages}
\begin{document}
\includepdf[pages={3-6, 17, 28, 29-31}]{inputPDFfilename}
\end{document}
一个棘手的方面是 pdfpages 采用绝对页码。目前我对 Andrey 方法中的包和语法不够熟悉,无法自己修改它。如果可以将其完全集成到创建我论文的同一个 LaTeX 项目中,那就太酷了。
答案1
此解决方案侵入figure
环境以输出彩色页面列表。您还可以使用\MarkColorPage
标记其他带有彩色内容的地方。数据在下一次 LaTeX 传递时输入回来,并用于构建黑白列表。然后将列表(具有绝对页码)写入文件<jobname>.bwlist
和<jobname>.colorlist
。我必须\clearpage
在最后添加,否则最后一页的页码会差一页。
之所以需要两次传递,是因为只有在页面输出时才能获得正确的页码(?),而这正是\write
和\iow_shipout_x:Nn
所做的。如果有办法以类似的方式推迟代码在输出时执行,那么一次传递就可以获得正确的列表。
(这是我第一次尝试使用 LaTeX3 进行编程。非常感谢大家的评论!)
\documentclass{article}
\usepackage{expl3,xparse}
\usepackage{atbegshi}
\ExplSyntaxOn
\clist_new:N \g_lp_bw_clist
\clist_new:N \g_lp_color_clist
\int_new:N \g_lp_page_int
\cs_new:Nn \lp_add_bw_page:n {
\clist_gput_right:Nx \g_lp_bw_clist {#1}
}
\cs_new:Nn \lp_add_color_page:n {
\clist_gput_right:Nx \g_lp_color_clist {#1}
}
\cs_new:Nn \lp_test_page: {
\int_gincr:N \g_lp_page_int
\exp_args:NNx \clist_if_in:NnF \g_lp_color_clist { \int_use:N \g_lp_page_int } {
\lp_add_bw_page:n { \int_use:N \g_lp_page_int }
}
}
\cs_new:Nn \lp_write_list:Nn {
\iow_open:Nn \g_lp_stream { \tl_use:N \c_job_name_tl .#2 }
\iow_now:Nx \g_lp_stream { \clist_use:N #1 }
\iow_close:N \g_lp_stream
}
\cs_new:Nn \lp_write_lists: {
\clist_gremove_duplicates:N \g_lp_color_clist
\lp_write_list:Nn \g_lp_bw_clist { bwlist }
\lp_write_list:Nn \g_lp_color_clist { colorlist }
}
\cs_new:Nn \lp_mark_color_page: {
\iow_shipout_x:Nn \g_lp_stream {
\exp_not:N \lp_add_color_page:n { \int_use:N \g_lp_page_int }
}
}
\AtBeginDocument{
\ExplSyntaxNamesOn
\file_input:n { \tl_use:N \c_job_name_tl .clp }
\ExplSyntaxNamesOff
\iow_open:Nn \g_lp_stream { \tl_use:N \c_job_name_tl .clp }
}
\AtBeginShipout{
\lp_test_page:
}
\AtEndDocument{
\clearpage
\iow_close:N \g_lp_stream
\lp_write_lists:
}
\cs_set_eq:NN \MarkColorPage \lp_mark_color_page:
\char_set_catcode_letter:N @
\RenewDocumentEnvironment { figure } { o } {
\IfNoValueTF {#1} {
\@float { figure }
}{
\@float { figure } [#1]
}
\lp_mark_color_page:
}{
\end@float
}
\char_set_catcode_other:N @
\ExplSyntaxOff
\begin{document}
\listoffigures
\clearpage
\begin{figure}
\caption{Test}
\end{figure}
\clearpage
\begin{figure}[!htbp]
\caption{Test}
\end{figure}
\clearpage
Hello World
\end{document}
要创建单独的 PDF,请在生成页面列表后使用此文档代码:
\documentclass{article}
\usepackage{pdfpages}
\newread\pagein
\openin\pagein=thesis.\listtype
\read\pagein to \pages
\closein\pagein
\begin{document}
\edef\optarg{[pages={\pages}]}
\expandafter\includepdf\optarg{thesis.pdf}
\end{document}
\listtype
应为bwlist
或colorlist
。您可以创建文档的两个副本,并\listtype
在每份副本中替换为适当的名称,或者在命令行上定义它(请参阅这个问题详情请见):
pdflatex'\def\liststype{bwlist} \input{something.tex}'
答案2
您可以直接在 PDF 上执行此操作,而无需使用 LaTeX。例如参见 将 PDF 拆分为包含彩色和黑白页面的单独文件。