我正在与同事一起处理一份文档,我们安装了不同版本的 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
/ \@xp
s 在 中的工作方式如下\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
谢谢您的意见!