根据软件包版本对代码进行条件编译

根据软件包版本对代码进行条件编译

我正在与同事一起处理一份文档,我们安装了不同版本的 PGF/Tikz - 我使用的是版本 3,而他使用的是版本 2.10。这导致我们两个平台上的编译出现问题,因为在 tikz 中定义矩阵的语法从版本 2.1 到 3.0 略有不同。

(看:无法使用 Pgf 3.0.0 中的矩阵自定义样式节点

我想做的是在文档开头添加代码,检查编译时使用的 pgf/tikz 版本。基于此,我希望执行与该版本的正确语法相匹配的某些代码块。

这可能吗?

答案1

当你这样做时,\usepackage{tikz}你就可以使用宏了\pgfversion。我们实际上只想比较主版本号,因此我们可以这样做

\documentclass{article}
\usepackage{tikz}

\newif\iftikziii
\begingroup
\def\getmainversion#1.#2\getmainversion{#1}
\ifnum\expandafter\getmainversion\pgfversion\getmainversion=3
  \global\tikziiitrue
\fi
\endgroup

\begin{document}
We have version \iftikziii 3\else 2\fi
\end{document}

您可以在文档中使用

\iftikziii
   <code for TikZ 3>
\else
   <code for TikZ 2>
\fi

如果您更喜欢双参数(伪)条件,请添加代码

\makeatletter
\newcommand{\tikziiiorii}{%
  \iftikziii
    \expandafter\@firstoftwo
  \else
    \expandafter\@secondoftwo
  \fi}
\makeatletter

因此上述文件可以变成

\documentclass{article}
\usepackage{tikz}

\newif\iftikziii
\begingroup
\def\getmainversion#1.#2\getmainversion{#1}
\ifnum\expandafter\getmainversion\pgfversion\getmainversion=3
  \global\tikziiitrue
\fi
\endgroup
\makeatletter
\newcommand{\tikziiiorii}{%
  \iftikziii
    \expandafter\@firstoftwo
  \else
    \expandafter\@secondoftwo
  \fi}
\makeatletter

\begin{document}
We have version \tikziiiorii{3}{2}
\end{document}

一般格式是

\tikziiiorii{<code for version 3>}{<code for version 2>}

答案2

你可以定义自己的条件,说\ifTikZVthree并使用

\ifTikZVthree
  % <TikZ version 3 stuff>
\else
  % <TikZ version pre-3 stuff>
\fi

在您的文档中定义单独的版本 3/pre-3 内容。以下最小示例定义了\checkTikZversion检查tikz通过宏- 每次加载包时定义。本质上,它非常类似于(参见\[email protected]\@ifpackagelater我使用的是哪个版本的软件包?),包括讨论检测正在使用的 LaTeX 格式版本

在此处输入图片描述

\documentclass{article}
\usepackage{tikz}
\makeatletter
\let\@xp\expandafter
\newif\ifTikZVthree
\def\@extractTikZversion#1 v#2 (#3){#2}
\newcommand{\checkTikZversion}{
  \@xp\@xp\@xp\@xp\@xp\@xp\@xp\ifnum
    \@xp\@xp\@xp\@xp\@xp\@xp\@xp\pdfstrcmp
      \@xp\@xp\@xp\@xp\@xp\@xp\@xp
        {\@xp\@xp\@xp\@extractTikZversion\csname [email protected]\endcsname}{ 3.0.0}=1
    \TikZVthreetrue
  \fi
}
\makeatother

\checkTikZversion% Check the current TikZ version
\begin{document}

\makeatletter
TikZ version: \@xp\@xp\@xp\strip@prefix\@xp\meaning\csname [email protected]\endcsname% Show current TikZ version
\makeatother

\ifTikZVthree
  TikZ version: 3.0.0% You are running TikZ version 3.0.0
\else
  Not TikZ version: 3.0.0% You are not running TikZ version 3.0.0
\fi

\end{document}

\expandafter/ \@xps 在 中的工作方式如下\checkTikZversion

\@xp\@xp\@xp\@xp\@xp\@xp\@xp\ifnum
  \@xp\@xp\@xp\@xp\@xp\@xp\@xp\pdfstrcmp
    \@xp\@xp\@xp\@xp\@xp\@xp\@xp
      {\@xp\@xp\@xp\@extractTikZversion\csname [email protected]\endcsname}{ 3.0.0}=1
  \TikZVthreetrue
\fi

经过第一批处理后\@xp,你剩下

\@xp\@xp\@xp\ifnum
  \@xp\@xp\@xp\pdfstrcmp
    \@xp\@xp\@xp
      {\@xp\@extractTikZversion\[email protected]}{ 3.0.0}=1
  \TikZVthreetrue
\fi

其中是 的展开结构。第二轮产生\[email protected]\csname [email protected]\endcsname

\@xp\ifnum
  \@xp\pdfstrcmp
    \@xp
      {\@extractTikZversion 2013/12/13 v3.0.0 (rcs-revision 1.142)}{ 3.0.0}=1
  \TikZVthreetrue
\fi

其中已扩展为 的完整版本(在我的计算机上)。下一个扩展通过 删除版本:\[email protected]tikz\@extractTikZversion

\ifnum
  \pdfstrcmp
    { 3.0.0}{ 3.0.0}=1
  \TikZVthreetrue
\fi

实际进行比较的位置(通过 e-TeX 的\pdfstrcmp)。根据输出,\ifTikZVthree设置为 true 或 false。请注意版本号前空格的具体用法。

答案3

第一个链接正是我所寻找的:

我使用的是哪个版本的软件包?

有一个 LaTeX 内核函数\@ifpackagelater可以通过测试软件包发布的日期来满足我的目的:

\makeatletter
\@ifpackagelater{tikz}{2013/10/01}
{
 % Code which runs if the package date is 2013/10/01 or later
}
{
 % Code which runs if the package date is older than 2013/10/01
}
\makeatother

谢谢您的意见!

相关内容