创建包含/不包含图片的纯 CSV 页面列表

创建包含/不包含图片的纯 CSV 页面列表

我想知道是否有一种简单的方法可以让 LaTeX 输出两个列表:

  1. 包含和的页面
  2. 不包含图形和/或其他彩色对象的页面。

我想用彩色打印机(昂贵)打印彩色页面,其余页面则以黑白打印。我希望能够拥有一个 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应为bwlistcolorlist。您可以创建文档的两个副本,并\listtype在每份副本中替换为适当的名称,或者在命令行上定义它(请参阅这个问题详情请见):

pdflatex'\def\liststype{bwlist} \input{something.tex}'

答案2

您可以直接在 PDF 上执行此操作,而无需使用 LaTeX。例如参见 将 PDF 拆分为包含彩色和黑白页面的单独文件

相关内容