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}"
产生如下结果:
它不会制作 tikzpicture 的外部 pdf,而是制作整个文档的外部 pdf。
我怎样才能让它正常编译?
编辑:一些额外的信息。
我想要实现与这里相同的目标:https://tex.stackexchange.com/a/158921/103166但仅当我编译为 html 时才会这样。
将外部化的 tikz 编译为 html 到 svg 需要分两步完成(?):
正常 pdflatex 运行生成 svgs
使用 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 确实不相关。问题纯粹是关于 Ti钾Z 外部化。我还简化了文档的图片和内容,并用不同的宏代替\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
需要捕获 的内容。