5 文件名为001,002,...,009,010,011,...,099,100,101,...,120如何优雅地批量插入?

发布于 2025-04-05 12:50:07

我有一些图片,想将其汇集制作成一个PDF画册。

这些图片的文件名假定是

         001.pdf, 002.pdf, ..., 009.pdf, 
010.pdf, 011.pdf, 012.pdf, ..., 099.pdf, 
100.pdf, 101.pdf, 102.pdf, ..., 119.pdf,
120.pdf

我使用的第一种方法,是分开处理,避免前缀问题,可惜这样稍显麻烦

\documentclass[tikz]{standalone}
\usepackage{pgffor}
\usepackage{graphicx}
\begin{document}
\foreach \x in {1,...,9} {\tikz{
    \node {\includegraphics[width=5cm]{p00\x.pdf}};
}}
\foreach \x in {10,...,99} {\tikz{
    \node {\includegraphics[width=5cm]{p0\x.pdf}};
}}
\foreach \x in {100,...,120} {\tikz{
    \node {\includegraphics[width=5cm]{p\x.pdf}};
}}
\end{document}

我使用的第二种方法,是在Excel中使用Excel公式将每一个文件名枚举出来,然后复制到\foreach \x in后面的编组内,不过这个做法是借助外部工具实现的:

\documentclass[tikz]{standalone}
\usepackage{pgffor}
\usepackage{graphicx}
\begin{document}
\foreach \x in {
p001,
p002,
p003,
p004,
p005,
p006,
p007,
p008,
p009,
p010,
p011,
p012,
p013,
p014,
p015,
p016,
p017,
p018,
p019,
p020,
p021,
p022,
p023,
p024,
p025,
p026,
p027,
p028,
p029,
p030,
p031,
p032,
p033,
p034,
p035,
p036,
p037,
p038,
p039,
p040,
p041,
p042,
p043,
p044,
p045,
p046,
p047,
p048,
p049,
p050,
p051,
p052,
p053,
p054,
p055,
p056,
p057,
p058,
p059,
p060,
p061,
p062,
p063,
p064,
p065,
p066,
p067,
p068,
p069,
p070,
p071,
p072,
p073,
p074,
p075,
p076,
p077,
p078,
p079,
p080,
p081,
p082,
p083,
p084,
p085,
p086,
p087,
p088,
p089,
p090,
p091,
p092,
p093,
p094,
p095,
p096,
p097,
p098,
p099,
p100,
p101,
p102,
p103,
p104,
p105,
p106,
p107,
p108,
p109,
p110,
p111,
p112,
p113,
p114,
p115,
p116,
p117,
p118,
p119,
p120} {\tikz{\node {\includegraphics[width=5cm]{\x.pdf}};}}
\end{document}

Tikz中有没有一种比较优雅的方法,纯靠TeXTikz来实现这个需求呢?

查看更多

关注者
1
被浏览
129
Sagittarius Rover
我要成为Typst糕手/(ㄒoㄒ)/~~

source2e.pdf中有一个名为\two@digits的宏

69 ⟨∗2ekernel⟩
70 \def\two@digits#1{\ifnum#1<10 0\fi\number#1}

这一问题也被称为前导零(leading-zero)问题,我想如果知道这点还是比较好搜索答案的...

Thanks to MICO

我的思路是模仿自定义\three@digits:

\documentclass[tikz]{standalone}
\usepackage{pgffor}
\usepackage{graphicx}
\begin{document}
\makeatletter
% \def\two@digits#1{\ifnum#1<10 0\fi\number#1}
\def\three@digits#1{\ifnum#1<10 00\else\ifnum#1<100 0\fi\fi\number#1}
\foreach \x in {1,...,120} {\tikz{
    % \node {\includegraphics[width=5cm]{p\x.pdf}};
    \node {\includegraphics[width=5cm]{p\three@digits{\x}.pdf}};
}}
\makeatother
\end{document}

image.png

2 个回答
Eureka
Eureka 1天前
这家伙很懒,什么也没写!

一个基于 expl3 的方法如下:

\documentclass{article}
\usepackage{graphicx}

\begin{document}
\ExplSyntaxOn
\cs_generate_variant:Nn \prg_replicate:nn {e}
\cs_new:Npn \three_digits:n #1 
  {% to keep expandable
    \prg_replicate:en {3-\tl_count:n {#1}}{0} #1
  }
\newcommand\PDFInclude[2][1]{
    \int_step_inline:nnn {#1}{#2}{
        %\includegraphics[width=5cm]{
            \three_digits:n {##1}.pdf\par
        %}
    }
}
\ExplSyntaxOff
An simple TEST I as follows:\par
\PDFInclude{10}

An simple TEST II as follows:\par
\PDFInclude[95]{111}
\end{document}

运行结果如下:
image.png

你可以把上面的 \PDFInclude 命令自己加以改造以符合自己的需求.

撰写答案

请登录后再发布答案,点击登录

发布
问题

分享
好友

手机
浏览

扫码手机浏览