我有一个.csv
名为的文件,sbriefdata
其中包含一些数据,例如
A;B;10
C;D;20
E;F;30
G;H;40
并且我希望文件.pdf
中的每一行都有一个单独的文件.csv
。我知道如何通过读取数据进行邮件合并,也知道如何.pdf
从这个问题(我使用了 Ulrike Fischer 提供的解决方案)。但是,我无法将这两个功能结合起来得到我想要的。我试过了
\documentclass{article}
\newif\ifmore \moretrue
\def\chopline#1;#2;#3\\{
\def\name{#1}
\def\vorname{#2}
\def\punkte{#3}
}
\begin{document}
\newread\data
\openin\data=sbriefdata.csv
\loop
\read\data to \line
\ifeof\data
\global\morefalse
\else
\expandafter\chopline\line\\
\ifx\conditionmacro\undefined
\immediate\write18{%
pdflatex --jobname="\jobname-\name"
"\gdef\string\conditionmacro{\name}\string\input\space\jobname"
}%
\expandafter\stop
\fi
\vorname \name \punkte \newline
\fi
\ifmore\repeat
\closein\data
\end{document}
但这只会生成一个名为 jobname-A 的 PDF,其中包含所有数据,而不是四个不同的 PDF。我似乎不完全理解构建多个 PDF 的命令(我认为因为它处于循环中,所以它应该生成多个 PDF)。所以我想知道
1)如何更改代码以获取多个 PDF 和/或
\ifx
2)和之间的命令具体起什么作用\fi
?例如,为什么这一行\ifx\conditionmacro\undefined
很重要,以及起什么"\gdef\string\conditionmacro{\name}\string\input\space\jobname"
作用?
答案1
第一次调用后,\stop
被调用并停止执行。因此不会生成任何附加文档。但我们如何修复代码呢?
我们仍然需要文档类和一种将行拆分成其字段的方法:
\documentclass{article}
\def\chopline#1;#2;#3 \\{
\def\name{#1}
\def\vorname{#2}
\def\punkte{#3}
}
现在有两种情况:要么我们直接被用户调用。然后我们从未定义过\conditionmacro
,我们想为每一行调用一个新的 LaTeX 实例。否则我们以这种方式调用,并且\conditionmacro
已经设置为 samoe 行。为了区分这些情况,我们测试是否\conditionmacro
未定义:
\ifx\conditionmacro\undefined
在第一种情况下,我们现在读取文件:首先打开它,然后循环读取每一行,直到到达文件末尾:
\newread\data
\openin\data=sbriefdata.csv
\loop
\read\data to \line
\unless\ifeof\data
现在我们进入循环体,必须处理一行。首先找出文件名的名称:
\expandafter\chopline\line\\
我们想将这一行传递给一个新pdflatex
实例,因此,例如,如果我们读取A;B;10
宏,\conditionmacro
则应将其定义为A;B;10
内部文件。这可以通过\gef\conditionmacro{A;B;10}
在常规文件内容前面添加来实现。所以:
\immediate\write18{%
pdflatex --jobname="\jobname-\name"
"\gdef\string\conditionmacro{\line}\string\input{\jobname}"
}%
整个“ \gdef\string\conditionmacro{\line}\string\input{\jobname}
”将在外部 TeX 实例中展开,\gdef\conditionmacro{A;B;10}\input{sbrief}
如果我们的原始文件名为 ,则会导致出现这种情况sbrief.tex
。这里\string
只是使用 来停止展开。这正是我们想要的:定义 然后读取原始文件内容\conditionmacro
。\input
\conditionmacro
现在我们的循环已经完成,我们可以关闭文件并结束外部 TeX 运行。
\repeat
\closein\data
\expandafter\stop
\fi
在我们的第一种情况下,我们停在上面\stop
,所以如果我们到达这一点,我们就处于第二种情况:\conditionmacro
设置完毕,我们必须创建实际文档之一。首先将\conditionmacro
其分成几个部分:
\expandafter\chopline\conditionmacro\\
然后“只需”创建文档:
\begin{document}
Hallo \vorname\space\name,
Sie haben \punkte\space Punkte erzielt.
\end{document}
完整代码:
\documentclass{article}
\def\chopline#1;#2;#3 \\{
\def\name{#1}
\def\vorname{#2}
\def\punkte{#3}
}
\ifx\conditionmacro\undefined
\newread\data
\openin\data=sbriefdata.csv
\loop
\read\data to \line
\unless\ifeof\data
\expandafter\chopline\line\\
\immediate\write18{%
pdflatex --jobname="\jobname-\name"
"\gdef\string\conditionmacro{\line}\string\input{\jobname}"
}%
\repeat
\closein\data
\expandafter\stop
\fi
\expandafter\chopline\conditionmacro\\
\begin{document}
Hallo \vorname\space\name,
Sie haben \punkte\space Punkte erzielt.
\end{document}
如果您还想收集收集的 PDF 中的所有子文档,您可以将 PDF 文件编译后包含到外部文档中:
\documentclass{article}
\def\chopline#1;#2;#3 \\{
\def\name{#1}
\def\vorname{#2}
\def\punkte{#3}
}
\ifx\conditionmacro\undefined
\usepackage{pdfpages}
\begin{document}
\newread\data
\openin\data=sbriefdata.csv
\loop
\read\data to \line
\unless\ifeof\data
\expandafter\chopline\line\\
\immediate\write18{%
pdflatex --jobname="\jobname-\name"
"\gdef\string\conditionmacro{\line}\string\input{\jobname}"
}%
\includepdf[pages=-]{\jobname-\name.pdf}
\repeat
\closein\data
\csname fi\endcsname
\end{document}
\fi
\expandafter\chopline\conditionmacro\\
\begin{document}
Hallo \vorname\space\name,
du hast \punkte\space Punkte erzielt.
\end{document}