tikz eksternalizacja i wiele osi przy użyciu \ ref i \ label dla legendy

Christian 10/05/2018. 1 answers, 0 views
pgfplots cross-referencing tikz-external legend

Mam wykres składający się z dwóch osi Y. Kiedy dodaję centra legendarne w każdym środowisku osi, pierwsza legenda zostanie wykreślona "za" wykresem drugiej osi. Tak więc pomyślałem, że rozwiązaniem może być \ ref \ label, aby narysować obie legendarne centra na końcu dokumentu, że pojawią się one na samym początku wszystkich wątków i nie zostaną ukryte. Niestety użycie eksternalizacji tikz daje błąd "nieokreślone referencje ...", a legendzie są podane z "??" tylko. Sprawdziłem instrukcję użycia \ legend \ ref z eksternalizacją, ale to nie pomaga. Próbowałem skompilować kilka razy.

\documentclass[fontsize=12pt,openright,oneside,DIV11,a4paper,numbers=noenddot,headsepline,parskip=half]{scrbook}
\usepackage[latin1]{inputenc}
\usepackage[cmex10]{amsmath}
\usepackage{siunitx}
\usepackage{tikz}
\usetikzlibrary[shapes.arrows]
\usepackage{pgfplots}
\pgfplotsset{compat=1.3}

% set up externalization
\usetikzlibrary{pgfplots.external}
\tikzset{external/system call={lualatex \tikzexternalcheckshellescape -halt-on-error -interaction=batchmode -jobname "\image" "\texsource"}}
\tikzexternalize


\begin{document}
\thispagestyle{empty}
    \begin{tikzpicture}
        \begin{axis}[
                legend cell align=left,
            bar width=7pt,
            xmin=-3, xmax=30,
            axis y line*=left,
            xlabel=Laser current / \si{\milli\ampere},
            ylabel=Tuning range / \si{\nano\metre},
            nodes near coords align=left,
            nodes near coords,]
        \addplot[ybar, ybar legend, draw=gray, fill=gray, color=gray] table[x=current,y=tuning] {Tun_SMSR.txt};

%          \addlegendentry{Abstimmbereich};
       \label{Abstimmbereich};
    \end{axis}

    \begin{axis}[
            every axis legend/.append style={fill=white, anchor=north west, at={(0.35,0.18)}},
            legend cell align=left,
            ybar=5pt,
            ybar interval=0.6,
            bar width=7pt,
            xmin=-3, xmax=30,
            ymin=30, ymax=60,
            axis y line*=right,
            axis x line=none,
            ylabel=SMSR / \si{\deci\bel},
            nodes near coords align=left,
            nodes near coords,]
        \addplot[ybar, ybar legend, draw=black, color=black] table[x=current,y=SMSR] {Tun_SMSR.txt};
       \label{SMSR};
%          \addlegendentry{SMSR};

    \end{axis}

\node [draw,fill=white] at (rel axis cs: 0.7,0.15) {\shortstack[l]{
\ref{Abstimmbereich} Abstimmbereich\\
\ref{SMSR} SMSR
}};

    \end{tikzpicture}
\end{document} 

Kompiluję za pomocą polecenia

lualatex -shell-escape "document name".tex 

Wynikowa figura pokazuje legendy, ale bez symboli i "??" zamiast.

1 Answers


Odwołujesz się do etykiety, która została przekazana do oddzielnego pliku pdf - co jest skomplikowanym zadaniem.

W tym przypadku "złożony" oznacza "zbyt złożony dla standardowej eksternalizacji obrazu". Aby odwoływać się do czegoś wewnątrz jakiegoś zewnętrznego obrazu, musisz podjąć specjalne kroki.

Aby zacytować z podręcznika pgfplots: "Dla punktu a), \ref wewnątrz uzewnętrznionej grafiki działa tylko wtedy, gdy wywołujesz wymagane wywołanie systemowe ręcznie lub przez make. Początkowy mode=convert with system call konfiguracji mode=convert with system call nie obsługuje \ref . Ale możesz skopiować wywołanie systemowe generowane przez mode=convert with system call i wydać je ręcznie, ponieważ \ref informacje są przechowywane w głównym pliku .aux , ale ten plik pomocniczy nie jest całkowicie zapisany, gdy mode=convert with system call jest wywoływany (istnieje warunek wyścigu) \pageref że \pageref nie jest obsługiwany (przepraszam) \pageref : jeśli masz \ref wewnątrz zewnętrznej grafiki, rozważ użycie mode=list and make lub kopiuj z systemu wywołanie obrazu (s ) i wydać go ręcznie. "

Alternatywnie możesz poczekać (powiedzmy) jeden tydzień, aż zostanie wydana następna wersja pgfplots. Obsługuje grafikę warstwową, dzięki czemu pierwsza legenda nie pojawi się za drugą osią.

Innym alternatywnym rozwiązaniem może być wstawienie wpisu legendy dla pierwszego wykresu do legendy drugiego obrazu za pomocą \addlegendimage{