条件 tikz 外部化在文档内生成文档

条件 tikz 外部化在文档内生成文档

mwe.tex:

%\def\Externalize{1} %This would work perfectly

\documentclass{article}
%\documentclass[varwidth=160mm]{standalone} %This has same problem

\usepackage[T1]{fontenc}
\usepackage[utf8]{inputenc}

\usepackage{tikz}
\usetikzlibrary{external}
\tikzset{
    tex4ht inc/.style={
        /pgf/images/include external/.code={%
            \includegraphics[]{##1.svg}%
        }
    }
}
\tikzset{
    external/system call/.add={}{%
        ; pdf2svg "\image.pdf" "\image.svg" "1"%
    }
}
\makeatletter
\@ifpackageloaded{tex4ht}{
    \tikzexternalize[mode=only graphics]%
}{
    \ifdefined\Externalize\tikzexternalize\fi% %% This produces weird     result
    %\tikzexternalize %%This works as expected even when latex ... "\def\Externalize{1} \input{mwe.tex}" is used
}
\makeatother

\begin{document}
\newsavebox{\MyPictureA}%
\savebox{\MyPictureA}{%
    \begin{tikzpicture} [scale=0.6, baseline={(current bounding box.center)}]   
    \tikzset{grid lines/.style={very thin, color=gray}}
    \draw [grid lines, step=1cm] (-1.5,-1.5) grid (7.2,6.2);

    \draw [very thick] (0,0) -- ++(4,0) -- ++(45:2) -- ++(0,4) -- ++(-4,0) -- ++(225:2) -- cycle;
    \draw [very thick] (4,0) -- (4,4) -- (0,4);
    \draw [very thick] (4,4) -- ++(45:2);   
    \end{tikzpicture}
}%
%
Kuutiojuuri on määritelmällisesti kolmanteen potenssiin korotuksen käänteistoimitus. Muistetaan, että kuution tilavuus saadaan laskettua korottamalla särmän pituus potenssiin kolme.

\begin{minipage}[c]{\textwidth - \wd\MyPictureA - 2em}
Esimerkiksi kuution, jonka särmän pituus on $4$, tilavuus saadaan laskemalla \mbox{$4^3=64$}.
\end{minipage}
\quad
\usebox{\MyPictureA}

Jos halutaan selvitää kuution särmän pituus, kun tilavuus tunnetaan. Pitäisi miettiä, mikä luku korotettuna potenssiin kolme tuottaa tilavuuden. Tätä laskutoimitusta voidaan merkitä kuutiojuurella.
\end{document}

使用命令进行编译:

$ pdflatex --shell-escape "\def\Externalize{1} \input{mwe.tex}"

产生如下结果:

韋萊.pdf

它不会制作 tikzpicture 的外部 pdf,而是制作整个文档的外部 pdf。

我怎样才能让它正常编译?

编辑:一些额外的信息。

我想要实现与这里相同的目标:https://tex.stackexchange.com/a/158921/103166但仅当我编译为 html 时才会这样。

将外部化的 tikz 编译为 html 到 svg 需要分两步完成(?):

  1. 正常 pdflatex 运行生成 svgs

  2. 使用 htlatex 或 make4ht 进行编译以生成包含上一阶段生成的 svg 的 html。

我有时也会编译为常规 pdf,因此我宁愿不使用外部化。虽然外部化不是问题,但我仍然想知道如何实现这一点。

我使用 bash 脚本进行编译:

编译2html.sh:

#!/bin/bash
pdflatex --shell-escape "\def\Externalize{1} \input{$1}"
make4ht -u -e mwe.mk4 -c mwe.cfg $1

mwe.mk4:

settings.latex_par = settings.latex_par .. " -interaction=nonstopmode"

mwe.cfg:

\Preamble{xhtml,mathml,html5}
\Configure{HTML}{\HCode{<html lang="en">\Hnewline}}
{\HCode{\Hnewline</html>}}

\Configure{@HEAD}{\HCode{\Hnewline<script type="text/javascript"
   src="https://cdn.mathjax.org/mathjax/latest/MathJax.js?
config=MML_CHTML">
   </script>\Hnewline}}

\makeatletter
\Configure{graphics*}  
         {svg}{  
          {\Configure{Needs}{File: \[email protected]}\Needs{}}
          \Picture[\csname a:GraphicsAlt\endcsname]{\csname 
Gin@base\endcsname.svg \csname a:Gin-dim\endcsname}%  
         }  
\makeatother

\begin{document}

\ifdefined\tikzexternalize\tikzexternalize[mode=only graphics]\fi
\ifdefined\tikzset\tikzset{tex4ht inc}\fi

\EndPreamble

答案1

我首先最小化了你的例子,因为 TeX4ht 确实不相关。问题纯粹是关于 TiZ 外部化。我还简化了文档的图片和内容,并用不同的宏代替\Externalize(以防万一)。

这给了我

\documentclass{article}
\usepackage[T1]{fontenc}
\usepackage[utf8]{inputenc}
\usepackage{tikz}
\usetikzlibrary{external}
\tikzset{
  external/system call/.add={}{%
    ; pdf2svg "\image.pdf" "\image.svg" "1"
  }
}
\makeatletter
\@ifpackageloaded{tex4ht}{
  \tikzexternalize[mode=only graphics]%
}{
  \ifdefined\MiXExternalize
  \tikzexternalize
  \fi
}
\makeatother

\begin{document}
\newsavebox{\MyPictureA}%
\savebox{\MyPictureA}{%
  \begin{tikzpicture}
    \draw (0,0) rectangle (1,1);
  \end{tikzpicture}
}%
Kuutiojuuri on määritelmällisesti kolmanteen potenssiin korotuksen käänteistoimitus. Muistetaan, että kuution tilavuus saadaan laskettua korottamalla särmän pituus potenssiin kolme.

\usebox{\MyPictureA}

Jos halutaan selvitää kuution särmän pituus, kun tilavuus tunnetaan. Pitäisi miettiä, mikä luku korotettuna potenssiin kolme tuottaa tilavuuden. Tätä laskutoimitusta voidaan merkitä kuutiojuurella.
\end{document}

作为测试案例。我认为装箱也没有任何意义,但是为了安全起见,我还是把它留下了。

然后

pdflatex --shell-escape "\def\MiXExternalize{1}\input{<filename>}`

将重现该问题。发生外部化,但 PDF 和 SVG 文件包含整个页面,而不仅仅是图片。

如果你看一下控制台输出,这里出现的问题就会变得更加明显。

===== 'mode=convert with system call': Invoking 'pdflatex -shell-escape -halt-on-error -interaction=batchmode -jobname "<filename>-figure0" "\def\tikzexternalrealjob{<filename>}\input{<filename>}"; pdf2svg "<filename>-figure0.pdf" "<filename>-figure0.svg" "1" ' 
========

问题在于,\MiXExternalize编译映像时未定义。因此,尽管外部化发生了,但它\tikzexternalize不会在外部化运行时执行。为了解决这个问题,我们需要我们的系统调用来定义宏。

\documentclass{article}
\usepackage[T1]{fontenc}
\usepackage[utf8]{inputenc}
\usepackage{tikz}
\usetikzlibrary{external}
\tikzset{
  external/system call={%
    pdflatex \tikzexternalcheckshellescape -halt-on-error -interaction=batchmode -jobname "\image" "\\def\\MiXExternalize{1} \\input{\texsource}";
    pdf2svg "\image.pdf" "\image.svg" "1"
  }
}
\makeatletter
\@ifpackageloaded{tex4ht}{
  \tikzexternalize[mode=only graphics]%
}{
  \ifdefined\MiXExternalize
  \tikzexternalize
  \fi
}
\makeatother

\begin{document}
\newsavebox{\MyPictureA}%
\savebox{\MyPictureA}{%
  \begin{tikzpicture}
    \draw (0,0) rectangle (1,1);
  \end{tikzpicture}
}%
Kuutiojuuri on määritelmällisesti kolmanteen potenssiin korotuksen käänteistoimitus. Muistetaan, että kuution tilavuus saadaan laskettua korottamalla särmän pituus potenssiin kolme.

\usebox{\MyPictureA}

Jos halutaan selvitää kuution särmän pituus, kun tilavuus tunnetaan. Pitäisi miettiä, mikä luku korotettuna potenssiin kolme tuottaa tilavuuden. Tätä laskutoimitusta voidaan merkitä kuutiojuurella.
\end{document}

使用此代码,PDF 和 SVG 外部化即可根据tikzpicture需要捕获 的内容。

相关内容