买者自负

买者自负

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 {} +

伪代码

  1. ${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
      

数据文件

  1. gif 文件名示例列表

    /home/masi/Images/cautious2.gif
    /home/masi/Images/cautious.gif
    
  2. 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.giffacepalm2.gif得到 0 页,pdflatex code.texxelatex 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( bashcfr)

\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.texwhen shthere

(/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.stderrsh使用时的内容

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部分改为bashcfr 建议的。输出pdflatex -shell-escape test2.tex:正确!

操作系统:Debian 8.7
TexLive:2017

答案1

首先,我认为这是个坏主意。没有理由把跑步convert作为跑步的一部分pdflatex。话虽如此,但这是可以做到的。

有四个基本步骤。

  1. 确定.gif要制作动画的文件。
  2. 转换foo.giffoo-0.pngfoo-1.png, ...,foo-n.png
  3. 决定n
  4. 做出图形。

对于步骤 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}

这些是我要处理的图像。 捂脸.gif 捂脸2.gif

正如代码中的注释所说,我将它们重命名为facepalm.giffacepalm2.gif

我创建了一个宏,它以基本名称(在本例中为或)\makegraphic作为参数。它尝试做的第一件事是通过一次打开一个文件来计算文件数量,直到打开一个文件失败。如果发现它们都不存在,则执行调用。它会第二次尝试计算文件数量。如果失败,TeX 将停止。(我可以使用真正的错误消息,但这只是为了演示,因此未定义的控制序列也可以正常工作。)facepalmfacepalm2.png\explodegifconvert.png

转换.gif是通过执行内部宏之一来完成的bashful。这样做的原因是\bash乱用字符代码并最终查找处于活动状态的^^M#1^^M\END位置^^M。最初,我做了类似的技巧来使\bash工作顺利进行,但最终,\bashIV{shell commands here}这样做更容易。请注意,我需要制作%一个普通符号字符,所以我^^A在宏中使用了一个注释。

最终,结果就是你想要的。它们是动画的,尽管我的截图显然不是。

在此处输入图片描述

答案2

这是对问题当前版本的回答。

请注意,我不认为这有什么吸引力并且不推荐它。

买者自负

用于测试目的的配置:

  • .tex工作目录中包含以下指定内容的文件。
  • 一个子目录anim
  • 三个用于转换的动画 GIF:anim/horn.gifanim/horna.gifanim/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}

3 个动画喇叭

为了使代码适应另一个环境,请进行编辑以./animfind语句中适当地改变并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,但特殊字符会很困难,而且看起来您在这里需要这些字符,即使不完全清楚您想要做什么。]

相关内容