LaTeX用datatool包\DTLforeach按csv数量生成3列矩阵的实现方法
解决方法
核心逻辑
- 提前加载索引表和所有子csv文件,避免在tabular环境内部执行IO操作引发排版异常
- 引入计数器记录当前遍历的文件序号,每遍历完指定列数就插入换行符
- 按表格行维度统一生成内容:先输出所有文件的表头行,再输出所有文件的图片行,最后输出所有文件的描述行,符合tabular的语法规则
可运行修改后代码
\documentclass[a4paper]{article} \usepackage{datatool} \newcounter{filecount} % 记录当前遍历的文件序号 \begin{document} % 生成测试文件(实际项目中可以删除所有filecontents段内容) \begin{filecontents}{index.csv} File 1.csv 2.csv 3.csv 4.csv 5.csv 6.csv 7.csv \end{filecontents} \begin{filecontents}{1.csv} Header 1 image 1 description 1 \end{filecontents} \begin{filecontents}{2.csv} Header 2 image 2 description 2 \end{filecontents} \begin{filecontents}{3.csv} Header 3 image 3 description 3 \end{filecontents} \begin{filecontents}{4.csv} Header 4 image 4 description 4 \end{filecontents} \begin{filecontents}{5.csv} Header 5 image 5 description 5 \end{filecontents} \begin{filecontents}{6.csv} Header 6 image 6 description 6 \end{filecontents} \begin{filecontents}{7.csv} Header 7 image 7 description 7 \end{filecontents} % 提前加载索引数据库 \DTLloaddb{index}{index.csv} % 提前加载所有子csv文件 \DTLforeach{index}{\theFile=File}{ \DTLloaddb{\theFile}{\theFile} } % 3列布局,调整列数时同步修改这里的列格式 \begin{tabular}{p{86pt} p{86pt} p{86pt}} \hline % 生成表头行 \setcounter{filecount}{0} \DTLforeach{index}{\theFile=File}{ \stepcounter{filecount} \DTLgetvalue{\currentVal}{\theFile}{1}{1} % 取子csv第1行第1列作为表头 \currentVal \ifnum\value{filecount}=3 \\ % 满指定列数换行 \setcounter{filecount}{0} \else \ & % 不满列数添加列分隔符 \fi } \\ % 处理最后一行不足列数的换行 \hline % 生成图片行 \setcounter{filecount}{0} \DTLforeach{index}{\theFile=File}{ \stepcounter{filecount} \DTLgetvalue{\currentVal}{\theFile}{2}{1} % 取子csv第2行第1列作为图片内容 \currentVal \ifnum\value{filecount}=3 \\ \setcounter{filecount}{0} \else \ & \fi } \\ \hline % 生成描述行 \setcounter{filecount}{0} \DTLforeach{index}{\theFile=File}{ \stepcounter{filecount} \DTLgetvalue{\currentVal}{\theFile}{3}{1} % 取子csv第3行第1列作为描述内容 \currentVal \ifnum\value{filecount}=3 \\ \setcounter{filecount}{0} \else \ & \fi } \\ \hline \end{tabular} \end{document}
调整列数方法
要生成3x4、3x5的矩阵布局,只需修改两处配置即可:
- 调整tabular环境的列定义,比如4列可以改为
p{64pt} p{64pt} p{64pt} p{64pt},根据实际需求调整列宽 - 将代码中所有
\ifnum\value{filecount}=3的判断值3替换为对应的列数(4或5)
如果子csv文件的行数不固定,可以将\DTLgetvalue的硬编码行号替换为嵌套的\DTLforeach循环实现动态读取。
内容的提问来源于stack exchange,提问作者Forest Selton
相关产品推荐
相关产品推荐

