我想利用“tex 中的 svg”技术。
以下是一段文本:
\documentclass{article}
\usepackage{color}
\usepackage{graphicx}
\newcommand{\executeiffilenewer}[3]{%
\ifnum\pdfstrcmp{\pdffilemoddate{#1}}%
{\pdffilemoddate{#2}}>0{\immediate\write18{#3}}
\fi}
\newcommand{\includesvg}[1]{%
\executeiffilenewer{#1.svg}{#1.pdf}%
{inkscape -z -D --file=#1.svg --export-pdf=#1.pdf --export-latex}%
\input{#1.pdf_tex}}
\begin{document}
\begin{figure}
\centering
%\def\svgwidth{\columnwidth}
\includesvg{svgfig}
\caption{My SVG Image}
\end{figure}
\end{document}
可以拍摄任意 svg 图像。
然后:
pdflatex -shell-escape tex-file
有效,但是
xelatex -shell-escape tex-file
和
xelatex -shell-escape -8bit tex-file
都给出错误:
! Undefined control sequence.
\executeiffilenewer #1#2#3->\ifnum \pdfstrcmp
{\pdffilemoddate {#1}}{\pdffil...
l.19 \includesvg{svgfig}
编辑:
目前,我在编译 doc 之前先从 svg 准备 pdf,所以我确实有“xetex 中的 svg”。我甚至在 bash 中自动执行了该操作,所以我非常高兴。尽管如此,所有问题都应该得到解决,所有问题都应得到清除——因此,如果了解 XeTeX 内部原理的人认为存在问题——应该报告并修复。
编辑2:
我使用的脚本太主观了。下面是完成这项工作的基本简单脚本:
#!/bin/bash
# to get description use the -h flag
# exit after a single error:
set -e
# ==========
# preambula:
PROGNAME=${0##*/}
PROGVERSION=1.12
TeX=`find . -maxdepth 1 -mindepth 1 -type f -name '*.tex' | sort | head -1`
usage()
{
cat << EO
Usage: $PROGNAME [OPTIONS...]
Script to build xelatex documents. It expects document following a particular rules.
Options
=======
EO
cat << EO | column -s\& -t
-t, --tex & TeX file (default to first TeX in the dir, currently it is: $TeX)
-i, --index & also build index: xelatex-(biber-xelatex)-makeindex-xelatex-xelatex
-e, --extra & perform and extra XeLaTeX run
-h, --help & show this output
-v, --version & show version information
EO
}
SHORTOPTS="hvt:e"
LONGOPTS="help,version,tex:,extra"
ARGS=$(getopt -s bash --options $SHORTOPTS --longoptions $LONGOPTS --name $PROGNAME -- "$@")
eval set -- "$ARGS"
while true; do
case $1 in
-t|--tex)
TeX=$2; shift;;
-e|--extra)
Extra=true;;
-h|--help)
usage; exit 0;;
-v|--version)
echo "$PROGVERSION"; exit 0;;
--)
shift; break;;
*)
shift; break;;
esac
shift
done
# ===========
## variables:
TexBaseName=`basename ${TeX%.tex}`
# =====================
## updating svg images:
find . -type f -name '*.svg' | while read svgFile; do
svgBasename=`basename $svgFile`
svgBasenameNoExt=${svgBasename%svg}
svgDir=`dirname $svgFile`
pdfFile=${svgDir}/${svgBasenameNoExt}pdf
if [ ! -e $pdfFile -o $svgFile -nt $pdfFile ]; then
echo -e "${PROGNAME}: $svgFile is newer!"
inkscape -z -D --file=$svgFile --export-pdf=$pdfFile --export-latex
fi
done
# ==========
## building:
# initial build
xelatex -shell-escape "${TeX}"
# bibliography: run biber + xelatex if there's a bcf file.
# And bcf file is there if you have loaded biblatex.
Bib=`find . -type f -name '*.bib'`
if [ -n "$Bib" ]; then
biber `ls *.bcf` || echo $?
# setting links:
xelatex -shell-escape "${TeX}"
fi
# setting links:
xelatex -shell-escape "${TeX}"
# extra build?
if $Extra; then
xelatex -shell-escape "${TeX}"
fi
# ===========
## reporting:
echo -e "${PROGNAME}: Done."
我将其命名为bk_XeLaTeXs_simple.bash
。为了构建文档,只需在主 tex 文件的目录中运行此脚本即可。此脚本假定目录中的第一个 tex 文件是主 tex 文件,但您也可以使用选项进行设置-t/--tex
。
该脚本查找 svg 文件,并将它们与相应的 pdf 文件进行比较:如果 svg 较新(或 pdf 不存在),则脚本使用 inkscape 重新生成 pdf 文件。因此,要加载名为x-y-sigma.svg
one 的 svg 文件,请编写:
\begin{figure}
\centering
\def\svgwidth{0.45\columnwidth}
\input{x-y-sigma.pdf_tex}
\caption{Test svg image.\label{fig:x-y-sigma}}
\end{figure}
如果您已加载源,此脚本也会调用biber
文件。*bcf
biblatex
最后,它有-e/--extra
一个 extran xelatex 构建选项。
这是一个文件夹的 zip 文件包含完整 MWE 所需的所有文件(包括 svg 和参考书目)。
答案1
有两个问题;XeTeX 字符串比较原语被称为\strcmp
not \pdfstrcmp
,因此很容易修复(更便携的方法是使用\pdf@strcmp
frompdftexcmds
包,它可以处理引擎差异)。
另一个问题是缺少 XeTeX 实现\pdffilemoddate
。我打开了一个 XeTeX票,当我有时间研究它时,当然欢迎补丁。