inkscape 中的 svg —— 在 xelatex 中不起作用?

inkscape 中的 svg —— 在 xelatex 中不起作用?

我想利用“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.svgone 的 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文件。*bcfbiblatex

最后,它有-e/--extra一个 extran xelatex 构建选项。

这是一个文件夹的 zip 文件包含完整 MWE 所需的所有文件(包括 svg 和参考书目)。

答案1

有两个问题;XeTeX 字符串比较原语被称为\strcmpnot \pdfstrcmp,因此很容易修复(更便携的方法是使用\pdf@strcmpfrompdftexcmds包,它可以处理引擎差异)。

另一个问题是缺少 XeTeX 实现\pdffilemoddate。我打开了一个 XeTeX,当我有时间研究它时,当然欢迎补丁。

相关内容