Tikz 定位库的奇怪副作用

Tikz 定位库的奇怪副作用

我在一篇论文中使用了 Tikz 和 chronology。但是,一旦使用 Tikz 定位库,我就会观察到奇怪的副作用。如果我删除定位库(并将其包含在任何地方,我认为这不是预期的),我可以解决这个问题。为什么会这样?如何正确使用这些库并避免此类副作用?

\documentclass[10pt,a4paper,final]{report}
\usepackage[utf8]{inputenc}
\usepackage{amsmath}
\usepackage{amsfonts}
\usepackage{amssymb}

\usepackage{tikz}
\usetikzlibrary{shapes,arrows,backgrounds,positioning} % remove 'positioning' for correct result
% http://i.imgur.com/DJNlDtv.jpg

\usepackage{chronology}

\begin{document}
\begin{figure}
\begin{chronology}[1]{1998}{2008}{7ex}{1\textwidth}
\event[1999]{2002}{ABC}
\event[2003]{2006}{DEF}
\event[2006]{2008}{GHI}
\end{chronology}
\end{figure}

\end{document}

图像

答案1

这里有两个问题。

首先,chronology使用的是已弃用的关键字形式right,而库重新定义了它。这解释了为什么在包含包positioning时 chronology 的输出会发生变化。positioning

其次,恕我直言,按时间顺序排列的时间轴上的文本定位并不好。它包括right=0.5\unit每个标签,这导致该标签向右移动,因此它不会出现在预期的日期上。

您的示例中可以清楚地看到这一点。标签 ABC、DEF 和 GHI 应该位于它们所跨越的日期(它们下方的灰色条)的顶部,但显然并非如此。显然这是故意的,因为 chronolgy 会通过right提到的选项移动它们,但我不明白为什么。

当您使用“单点”日期而不是日期范围时,这种情况尤其严重。例如:

\begin{figure}
\begin{chronology}[1]{1998}{2008}{7ex}{1\textwidth}
\event{2003}{Foo}
\event[2003]{2004}{Bar}
\end{chronology}
\end{figure}

生成:

结果

在我看来,水平位移使得时间线难以阅读。标签 Foo 指的是 2003 年(确实如此)还是 2003-2004 年的范围?(它看起来是这样的)

我建议进行以下修复。将其添加到您的序言中:

\renewcommand{\event}[3][e]{%
  \pgfmathsetlength\xstop{(#2-\theyearstart)*\unit}%
  \ifx #1e%
    \draw[fill=black,draw=none,opacity=0.5]%
      (\xstop, 0) circle (.2\unit)%
      node[anchor=south west, yshift=.2\unit,rotate=45,opacity=1] {#3};%
  \else%
    \pgfmathsetlength\xstart{(#1-\theyearstart)*\unit}%
    \draw[fill=black, opacity=0.5,rounded corners=.2\unit]%
      (\xstart,-.2\unit) rectangle%
      node[anchor=south west, yshift=.2\unit,rotate=45,opacity=1] {#3} (\xstop,.2\unit);%
  \fi}%

使用这个前言,输出现在是:

结果

(在我看来)这看起来更自然。

此外,我的代码无论有没有positioning库都会产生相同的结果,因为它没有使用冲突的right关键字。

如果您希望标签向右移动(就像chronology默认的那样),您可以将选项添加xshift=0.5\unit到每个node定义中\event

答案2

该问题已在该软件包的 1.1.1 版本中修复。

请注意,自 1.1 版本以来,有一个新的语法,如下所示:

#1 (optional) = stepsize, 
#2 = yearstart, 
#3 = yearstop, 
#4 = postscaledtimelinewidth, 
#5 (optional) = prescaledtimelinewidth

您和 JLDiaz 的示例代码如下所示:

% arara: pdflatex

\documentclass[a4paper]{report}
\usepackage{chronology}
\usetikzlibrary{positioning}

\begin{document}
    \begin{figure}
        \begin{chronology}[1]{1998}{2008}{\textwidth}
            \event[1999]{2002}{ABC}
            \event[2003]{2006}{DEF}
            \event[2006]{2008}{GHI}
        \end{chronology}
    \end{figure}
    \begin{figure}[h]
        \begin{chronology}[1]{1998}{2008}{\textwidth}
            \event{2003}{Foo}
            \event[2003]{2004}{Bar}
        \end{chronology}
    \end{figure}    
\end{document}

结果是:

在此处输入图片描述

相关内容