Unix 命令从目录中的 gif 图片制作 png 系列
# steeldriver, https://unix.stackexchange.com/a/370132/16920
find -L . -name '*.gif' -execdir sh -c 'for f;
do convert -coalesce "$f" "${f%.gif}%05d.png";
done' sh {} +
伪代码
${f%.gif}%05d
通过某种方式一步将信息传递给 LaTeX。find
最大文件名系列结束并将其应用于 LaTeX 文件文件名并进行迭代。伪代码用于查找最大系列图像计数\usepackage{bashful} \bash[stdoutFile=gif_series.tex] find -L . -name '*.png' -execdir sh -c 'for f; ... TODO LaTeX + find max image count + apply it to LaTeX done ' sh {} + \END
数据文件
gif 文件名示例列表
/home/masi/Images/cautious2.gif /home/masi/Images/cautious.gif
png 图像系列的示例列表,其中结束数字最大为 99
/home/masi/Images/cautious200000.png /home/masi/Images/cautious200001.png ... /home/masi/Images/cautious00000.png ...
LaTeX,我想将图像系列直接放在自己的页面上,文件名现在是out000xyzw
\documentclass{beamer}
\usepackage{bashful}
\usepackage{pgffor} % I think needed, but possibly not since Bash
\usepackage{animate}
\usepackage{graphicx}
\begin{document}
\begin{frame}
\begin{figure}
% TODO apply here Bashful somehow
% TODO something wrong here because the bash should be inserted here and not to a new file if the main script is compiled
\bash[stdoutFile=gif_series.tex]
% AlexG, https://tex.stackexchange.com/a/373780/13173
\animategraphics[
width=\textwidth,
controls,autoplay,loop
]{12}{out000}{00}{16} % TODO here {out000}{00}{16} for dynamics
\END
\end{figure}
\end{frame}
\end{document}
测试 TH. 的代码
我必须touch test.stdout test.stderr test.stoutwas
为脚本做。输出和facepalm1.gif
,facepalm2.gif
得到 0 页,pdflatex code.tex
和xelatex code.tex
r-environment-dictionary/translator-environment-dictionary-English.dict)
(/usr/local/texlive/2017/texmf-dist/tex/latex/beamer/translator/dicts/translato
r-months-dictionary/translator-months-dictionary-English.dict)
(/usr/local/texlive/2017/texmf-dist/tex/latex/beamer/translator/dicts/translato
r-numbers-dictionary/translator-numbers-dictionary-English.dict)
(/usr/local/texlive/2017/texmf-dist/tex/latex/beamer/translator/dicts/translato
r-theorem-dictionary/translator-theorem-dictionary-English.dict)
No file test.nav.
after EOF
(./test.stdout) (./test.aux) )
No pages of output.
Transcript written on test.log.
输出为pdflatex -shell-escape code.tex
:正确!
测试 cfr 第二个答案
修正工作代码,删除 to./anim
并./
改为sh
( bash
cfr)
\documentclass{beamer}
\usepackage{bashful,animate,pgffor}
\begin{document}
\bash
find . -name '*.gif' -execdir bash -c 'for i;
do
c=$(convert -coalesce -identify "$i" "${i/\.gif/.png}" | wc -l);
((c--));
printf \%b "$(basename ${i/\.gif/})/$c,";
done' bash {} + | sed 's/,$//'
\END
\begin{frame}
\centering
\foreach \i/\j in \bashStdout {\animategraphics[width=.2\linewidth,controls,autoplay,loop]{12}{\i-}{0}{\j} \\ }
\end{frame}
\end{document}
文件
masi@masi:~/Desktop/test.animate/anim$ ls
horna.gif horn.gif test2.log test2.sh
hornb.gif test2.aux test2.out test2.tex
编译后输出pdflatex -shell-escape test2.tex
when sh
there
(/usr/local/texlive/2017/texmf-dist/tex/latex/beamer/translator/dicts/translato
r-theorem-dictionary/translator-theorem-dictionary-English.dict)
No file test2.nav.
Standard error not empty. Here is how
file test2.stderr begins:
>>>>sh: 3: sh: Bad substitution
>>>>
but, you really ought to examine this file yourself!
! Your shell script failed....
\checkScriptErrors@BL ...r shell script failed...}
\BL@verbosetrue \logBL {Sw...
l.11 \END
?
L11: Switching to verbose mode
L11: Checking whether any listings are required
L11: Nothing has to be listed
L11: Defining macro for the contents of the standard output file
L11: Opened file test2.stdout
L11: Reading contents of test2.stdout
after EOF
L11: bashStdout :=
/0,/0,/0
L11: Closing file test2.stdout
L11: Defining macro for the contents of the standard error file
L11: Opened file test2.stderr
L11: Reading contents of test2.stderr
L11: bashStderr :=
sh: 3: sh: Bad substitution
L11: Closing file test2.stderr
L11: Wrap up done
L11: bashV: Done!
! Package animate Error: None of the files
(animate) `-0.pdf',
(animate) `-0.mps',
(animate) `-0.png',
(animate) `-0.jpg',
(animate) `-0.jpeg',
(animate) `-0.jbig2',
(animate) `-0.jb2',
(animate) `-0.jp2',
(animate) `-0.j2k' or
(animate) `-0.jpx',
(animate) could be found.
(animate) Wrong file type? Mis-spelled file name?.
See the animate package documentation for explanation.
Type H <return> for immediate help.
...
l.15 \end{frame}
输出sh
:pdf 中没有 .gif 动画,图 1 中没有生成 pdf
图1sh
使用时cfr代码输出
test2.stderr
sh
使用时的内容
sh: 3: sh: Bad substitution
sh: 4: sh: c--: not found
sh: 5: sh: Bad substitution
sh: 3: sh: Bad substitution
sh: 4: sh: c--: not found
sh: 5: sh: Bad substitution
sh: 3: sh: Bad substitution
sh: 4: sh: c--: not found
sh: 5: sh: Bad substitution
解决方案:将原来的sh
部分改为bash
cfr 建议的。输出pdflatex -shell-escape test2.tex
:正确!
操作系统:Debian 8.7
TexLive:2017
答案1
首先,我认为这是个坏主意。没有理由把跑步convert
作为跑步的一部分pdflatex
。话虽如此,但这是可以做到的。
有四个基本步骤。
- 确定
.gif
要制作动画的文件。 - 转换
foo.gif
为foo-0.png
,foo-1.png
, ...,foo-n.png
。 - 决定n。
- 做出图形。
对于步骤 1,您可以使用bashful
来查找所有.gif
文件,或者您可以做一些更明智的事情,只需写下您想要转换的文件即可。我将展示这两种方法。
对于步骤 2,您绝对应该自己运行转换,但是您想使用来完成bashful
,所以这就是这个答案的作用。
对于第 3 步,您可以使用bashful
,我想如果你使用 执行了步骤 1 或 2 bashful
,你也可能这样做;但是,没有必要。我们可以在 TeX 中轻松完成此操作,所以这就是这个答案的作用。
对于步骤 4,您只需使用\animategraphics
适当的参数执行。
这是我的代码。
\documentclass{beamer}
\usepackage{animate}
\usepackage{bashful}
\newcount\seriesmax
\newread\seriesfile
% Count how many files are in the series.
\newcommand*\countseries[1]{%
\seriesmax=0
\loop
\openin\seriesfile=#1-\number\seriesmax.png
\ifeof\seriesfile\else
\closein\seriesfile
\advance\seriesmax by1
\repeat
\advance\seriesmax by-1
}
% This is just ridiculous. This should not be done from within LaTeX.
\begingroup
\catcode`\^^A=14
\catcode`\%=12
\gdef\explodegif#1{^^A
\bashIV{convert -coalesce #1.gif '#1-%d.png'}^^A
}
\endgroup
\newcommand*\makegraphic[1]{%
\countseries{#1}%
\ifnum\seriesmax<0
\explodegif{#1}%
\countseries{#1}%
\ifnum\seriesmax<0
\nosuchseries
\fi
\fi
\begin{figure}%
\noindent
\animategraphics[width=\textwidth,controls,autoplay,loop]%
{12}{#1-}{0}{\number\seriesmax}%
\end{figure}%
}
\begin{document}
% Downloaded from https://media.giphy.com/media/3og0INyCmHlNylks9O/giphy-downsized.gif
% and https://media.giphy.com/media/XsUtdIeJ0MWMo/giphy-downsized.gif
% and renamed to facepalm.gif and facepalm2.gif, respectively.
% One option is to specify exactly what you want.
%\makegraphic{facepalm}
%\makegraphic{facepalm2}
% The other option is to have `\bash` find them for you.
\bash
for i in *.gif; do echo "\makegraphic{$(basename $i .gif)}"; done
\END
\input\csname BL@stdoutFile\endcsname
\end{document}
正如代码中的注释所说,我将它们重命名为facepalm.gif
和facepalm2.gif
。
我创建了一个宏,它以基本名称(在本例中为或)\makegraphic
作为参数。它尝试做的第一件事是通过一次打开一个文件来计算文件数量,直到打开一个文件失败。如果发现它们都不存在,则执行调用。它会第二次尝试计算文件数量。如果失败,TeX 将停止。(我可以使用真正的错误消息,但这只是为了演示,因此未定义的控制序列也可以正常工作。)facepalm
facepalm2
.png
\explodegif
convert
.png
转换.gif
是通过执行内部宏之一来完成的bashful
。这样做的原因是\bash
乱用字符代码并最终查找处于活动状态的^^M#1^^M\END
位置^^M
。最初,我做了类似的技巧来使\bash
工作顺利进行,但最终,\bashIV{shell commands here}
这样做更容易。请注意,我需要制作%
一个普通符号字符,所以我^^A
在宏中使用了一个注释。
最终,结果就是你想要的。它们是动画的,尽管我的截图显然不是。
答案2
这是对问题当前版本的回答。
请注意,我不认为这有什么吸引力并且不推荐它。
买者自负
用于测试目的的配置:
.tex
工作目录中包含以下指定内容的文件。- 一个子目录
anim
。 - 三个用于转换的动画 GIF:
anim/horn.gif
和anim/horna.gif
。anim/hornb.gif
所有动画均由 Danjiro Daiwa 制作,可在以下网址找到https://codepen.io/danjiro/post/how-to-make-animated-gif-from-openclipart。要编译示例,请下载这个动画,命名horn.gif
并制作两份副本,horna.gif
然后hornb.gif
。(实际上,只要它们具有扩展名,您可以随意命名它们.gif
,但要复制我所做的,请按指定名称命名。)
\documentclass{beamer}
\usepackage{bashful,animate,pgffor}
\begin{document}
\bash
find ./anim -name '*.gif' -execdir bash -c 'for i;
do
c=$(convert -coalesce -identify "$i" "${i/\.gif/.png}" | wc -l);
((c--));
printf \%b "$(basename ${i/\.gif/})/$c,";
done' bash {} + | sed 's/,$//'
\END
\begin{frame}
\centering
\foreach \i/\j in \bashStdout {\animategraphics[width=.2\linewidth,controls,autoplay,loop]{12}{anim/\i-}{0}{\j} \\ }
\end{frame}
\end{document}
为了使代码适应另一个环境,请进行编辑以./anim
在find
语句中适当地改变并anim
在\animategraphics
参数中适当地改变。
请注意,我的 PDF 查看器实际上无法运行动画,因此我无法确定这是否有效。如果有人能启发我,我将不胜感激。
正如我所说,我不知道这样做有什么意义。你多久会想在一张幻灯片中使用多个动画,并且可以使用循环来管理?如果你真的在幻灯片中使用多个动画,那么你只会给观众带来视觉干扰。
但是,本网站并不讨论好的想法,而只是讨论人们碰巧想到的任何想法的实现,无论这些想法有多么错误。否则,这个答案就不会存在。
警告!不要在家尝试。无论有没有家长指导,都不建议这样做,但如果必须这样做,请考虑避免让父母伤心。
编辑
这是在同一目录中使用的版本。
设置:工作目录包含
horn.gif horna.gif hornb.gif test2.tex
test2.tex
:
\documentclass{beamer}
\usepackage{bashful,animate,pgffor}
\begin{document}
\bash
find . -name '*.gif' -execdir bash -c 'for i;
do
c=$(convert -coalesce -identify "$i" "${i/\.gif/.png}" | wc -l);
((c--));
printf \%b "$(basename ${i/\.gif/})/$c,";
done' bash {} + | sed 's/,$//'
\END
\begin{frame}
\centering
\foreach \i/\j in \bashStdout {\animategraphics[width=.2\linewidth,controls,autoplay,loop]{12}{\i-}{0}{\j} \\ }
\end{frame}
\end{document}
test2.sh
应包含:
% find . -name '*.gif' -execdir bash -c 'for i;
do
c=$(convert -coalesce -identify "$i" "${i/\.gif/.png}" | wc -l);
((c--));
printf \%b "$(basename ${i/\.gif/})/$c,";
done' bash {} + | sed 's/,$//'
test2.stdout
应该包含(末尾没有换行符):
horna/9,hornb/9,horn/9
test2.stderr
应为空。
test2.log
应包括:
\openout5 = `test2.sh'.
runsystem(bash -c "bash test2.sh >test2.stdout 2>test2.stderr || echo $? >test2
.exitCode")...executed.
\openout5 = `test2.sh'.
after EOF
<horna-0.png, id=24, 321.2pt x 321.2pt>
File: horna-0.png Graphic file (type png)
<use horna-0.png>
Package pdftex.def Info: horna-0.png used on input line 15. on input line 15.
Package pdftex.def Info: Requested size: 321.19922pt x 321.19922pt on input lin
e 15.
<./horna-0.png> <a0,fr0>
<horna-1.png, id=33, 321.2pt x 321.2pt>
File: horna-1.png Graphic file (type png)
<use horna-1.png>
Package pdftex.def Info: horna-1.png used on input line 15. on input line 15.
Package pdftex.def Info: Requested size: 321.19922pt x 321.19922pt on input lin
e 15.
<./horna-1.png> <a0,fr1>
<horna-2.png, id=42, 321.2pt x 321.2pt>
File: horna-2.png Graphic file (type png)
<use horna-2.png>
Package pdftex.def Info: horna-2.png used on input line 15. on input line 15.
Package pdftex.def Info: Requested size: 321.19922pt x 321.19922pt on input lin
e 15.
<./horna-2.png> <a0,fr2>
<horna-3.png, id=51, 321.2pt x 321.2pt>
File: horna-3.png Graphic file (type png)
<use horna-3.png>
Package pdftex.def Info: horna-3.png used on input line 15. on input line 15.
Package pdftex.def Info: Requested size: 321.19922pt x 321.19922pt on input lin
e 15.
<./horna-3.png> <a0,fr3>
<horna-4.png, id=60, 321.2pt x 321.2pt>
File: horna-4.png Graphic file (type png)
<use horna-4.png>
Package pdftex.def Info: horna-4.png used on input line 15. on input line 15.
Package pdftex.def Info: Requested size: 321.19922pt x 321.19922pt on input lin
e 15.
<./horna-4.png> <a0,fr4>
<horna-5.png, id=69, 321.2pt x 321.2pt>
File: horna-5.png Graphic file (type png)
<use horna-5.png>
Package pdftex.def Info: horna-5.png used on input line 15. on input line 15.
Package pdftex.def Info: Requested size: 321.19922pt x 321.19922pt on input lin
e 15.
<./horna-5.png> <a0,fr5>
<a0,fr6> <a0,fr7> <a0,fr8> <a0,fr9>
<hornb-0.png, id=108, 321.2pt x 321.2pt>
File: hornb-0.png Graphic file (type png)
<use hornb-0.png>
Package pdftex.def Info: hornb-0.png used on input line 15. on input line 15.
Package pdftex.def Info: Requested size: 321.19922pt x 321.19922pt on input lin
e 15.
<./hornb-0.png> <a1,fr0>
<hornb-1.png, id=117, 321.2pt x 321.2pt>
File: hornb-1.png Graphic file (type png)
<use hornb-1.png>
Package pdftex.def Info: hornb-1.png used on input line 15. on input line 15.
Package pdftex.def Info: Requested size: 321.19922pt x 321.19922pt on input lin
e 15.
<./hornb-1.png>
<a1,fr1>
<hornb-2.png, id=126, 321.2pt x 321.2pt>
File: hornb-2.png Graphic file (type png)
<use hornb-2.png>
Package pdftex.def Info: hornb-2.png used on input line 15. on input line 15.
Package pdftex.def Info: Requested size: 321.19922pt x 321.19922pt on input lin
e 15.
<./hornb-2.png> <a1,fr2>
<hornb-3.png, id=135, 321.2pt x 321.2pt>
File: hornb-3.png Graphic file (type png)
<use hornb-3.png>
Package pdftex.def Info: hornb-3.png used on input line 15. on input line 15.
Package pdftex.def Info: Requested size: 321.19922pt x 321.19922pt on input lin
e 15.
<./hornb-3.png> <a1,fr3>
<hornb-4.png, id=144, 321.2pt x 321.2pt>
File: hornb-4.png Graphic file (type png)
<use hornb-4.png>
Package pdftex.def Info: hornb-4.png used on input line 15. on input line 15.
Package pdftex.def Info: Requested size: 321.19922pt x 321.19922pt on input lin
e 15.
<./hornb-4.png>
<a1,fr4>
<hornb-5.png, id=153, 321.2pt x 321.2pt>
File: hornb-5.png Graphic file (type png)
<use hornb-5.png>
Package pdftex.def Info: hornb-5.png used on input line 15. on input line 15.
Package pdftex.def Info: Requested size: 321.19922pt x 321.19922pt on input lin
e 15.
<./hornb-5.png> <a1,fr5> <a1,fr6> <a1,fr7> <a1,fr8> <a1,fr9>
<horn-0.png, id=191, 321.2pt x 321.2pt>
File: horn-0.png Graphic file (type png)
<use horn-0.png>
Package pdftex.def Info: horn-0.png used on input line 15. on input line 15.
Package pdftex.def Info: Requested size: 321.19922pt x 321.19922pt on input lin
e 15.
<./horn-0.png> <a2,fr0>
<horn-1.png, id=200, 321.2pt x 321.2pt>
File: horn-1.png Graphic file (type png)
<use horn-1.png>
Package pdftex.def Info: horn-1.png used on input line 15. on input line 15.
Package pdftex.def Info: Requested size: 321.19922pt x 321.19922pt on input lin
e 15.
<./horn-1.png> <a2,fr1>
<horn-2.png, id=209, 321.2pt x 321.2pt>
File: horn-2.png Graphic file (type png)
<use horn-2.png>
Package pdftex.def Info: horn-2.png used on input line 15. on input line 15.
Package pdftex.def Info: Requested size: 321.19922pt x 321.19922pt on input lin
e 15.
<./horn-2.png> <a2,fr2>
<horn-3.png, id=218, 321.2pt x 321.2pt>
File: horn-3.png Graphic file (type png)
<use horn-3.png>
Package pdftex.def Info: horn-3.png used on input line 15. on input line 15.
Package pdftex.def Info: Requested size: 321.19922pt x 321.19922pt on input lin
e 15.
<./horn-3.png>
<a2,fr3>
<horn-4.png, id=227, 321.2pt x 321.2pt>
File: horn-4.png Graphic file (type png)
<use horn-4.png>
Package pdftex.def Info: horn-4.png used on input line 15. on input line 15.
Package pdftex.def Info: Requested size: 321.19922pt x 321.19922pt on input lin
e 15.
<./horn-4.png> <a2,fr4>
<horn-5.png, id=236, 321.2pt x 321.2pt>
File: horn-5.png Graphic file (type png)
<use horn-5.png>
Package pdftex.def Info: horn-5.png used on input line 15. on input line 15.
Package pdftex.def Info: Requested size: 321.19922pt x 321.19922pt on input lin
e 15.
<./horn-5.png> <a2,fr5> <a2,fr6> <a2,fr7>
<a2,fr8> <a2,fr9>
编辑 编辑请指定bash
而不是sh
以防万一sh
是别的。
答案3
[原本是一条评论,但变得可笑。]
请注意,这个答案以其原始形式回答了该问题。我把它留在这里,因为它仍然试图解释为什么 OP 的代码令人困惑。然而,它并没有提供积极的建议,因为当时这是不可能的。
这是起什么作用的?
\bash[stdoutFile=gif_series.tex]
% AlexG, https://tex.stackexchange.com/a/373780/13173
\animategraphics[
width=\textwidth,
controls,autoplay,loop
]{12}{out000}{00}{16} % TODO here {out000}{00}{16} for dynamics
\END
\bash[stdoutFile=gif_series.tex]
告诉 LaTeX 使用 bash 执行后续脚本,将“标准输出”定向到文件gif_series.tex
。这是脚本通常发送到终端的任何输出,而不是错误等。因此,您将获得一个新文件gif_series.tex
(如果它尚不存在),其中包含脚本的非错误结果(如果有)。
% AlexG, https://tex.stackexchange.com/a/373780/13173
bash 不知道如何处理它。这不是 bash 代码。在 LaTeX 中,这将是一条注释,但 bash 只会给出错误。
\animategraphics[
width=\textwidth,
controls,autoplay,loop
]{12}{out000}{00}{16} % TODO here {out000}{00}{16} for dynamics
可能在 LaTeX 中执行某些操作,但在 bash 中除了给出错误外不会执行任何操作。
LaTeX 的内容不能作为脚本的一部分。如果您想将 GIF 拆分为编译的一部分,您可以通过让 bash 执行此操作来实现。您还可以将文件列表写入文件,然后将其输入回 LaTeX。或者,如果您的文件列表相对较小,您可以将其保存到变量并恢复该值。但您不能一步完成你想做的事情,因为 bash 不是 LaTeX,而 LaTeX 也不是 bash。
[您可以使用\splice
,但特殊字符会很困难,而且看起来您在这里需要这些字符,即使不完全清楚您想要做什么。]