Wie füge ich ausgewertete Referenzen in diese Sortierroutine ein?

Wie füge ich ausgewertete Referenzen in diese Sortierroutine ein?

Unten ist ein Code, den ich aus Beispielen aus dem Internet zusammengeschustert habe. Ich möchte, dass die Routine für sortierte Listen die Ergebnisse der Auswertung von \ref verwendet, anstatt das wörtliche Argument von \ref zu verwenden.

Leider geschieht dies nicht in der richtigen Reihenfolge oder die Sortierroutine merkt sich die Ergebnisse der Auswertung mehrerer \ref-Instanzen nicht.

Gedanken?

            \documentclass{report}


            \newcounter{TableNoteCounter}
            \renewcommand{\theTableNoteCounter}{\alph{TableNoteCounter}}
            \newcommand{\tablenotelabel}[1]{\refstepcounter{TableNoteCounter}\alph{TableNoteCounter}\label{#1}}


            \usepackage{datatool}% http://ctan.org/pkg/datatool
             \newcommand{\sortitem}[2]{%
             \DTLnewrow{list}%
             \DTLnewdbentry{list}{label}{\ref{#1}}%
             \DTLnewdbentry{list}{description}{#2}%
             }

             \newenvironment{sortedlist}%
             {%
             \DTLifdbexists{list}{\DTLcleardb{list}}{\DTLnewdb{list}}%
             }%
             {%
             \DTLsort{label}{list}%
             \begin{description}%
             \DTLforeach*{list}{\theLabel=label,\theDesc=description}{%
             \item[\theLabel] \theDesc
             }%
             \end{description}%
             }


            \begin{document}

            \tablenotelabel{stars}
            \tablenotelabel{galaxies}
            \tablenotelabel{planets}


            \begin{sortedlist}
                \sortitem{planets}{Some planets are inhabited.}
                \sortitem{galaxies}{Some galaxies are grand.}
                \sortitem{stars}{All stars ``burn'' hydrogen.}
            \end{sortedlist}


            \end{document}

Antwort1

Sie können verwenden, um in \dtlexpandnewvaluezu erweitern . Dies ist jedoch nur möglich, wenn definiert wurde und zwar erst, nachdem die .aux-Datei erstellt wurde. Daher ist das Folgende die Ausgabe nach dem\ref\sortitem\refzweiter Lauf:

Bildbeschreibung hier eingeben

Während dererster LaufDies wird wie folgt angezeigt:

Bildbeschreibung hier eingeben

Anmerkungen:

  • Um die Verwendung mit zu ermöglichen, hyperrefüberprüfe ich jetzt, ob \HyPsd@@@refdefiniert ist (welches Medium das hyperrefverwendet wird) und verwende es ggf. \HyPsd@@@refanstelle von \ref.

Code:

\documentclass{report}

\usepackage{alphalph}
\usepackage{datatool}% http://ctan.org/pkg/datatool
\usepackage{hyperref}


\newcounter{TableNoteCounter}
\renewcommand{\theTableNoteCounter}{\alphalph{\value{TableNoteCounter}}}
\newcommand{\tablenotelabel}[1]{\refstepcounter{TableNoteCounter}\alphalph{\value{TableNoteCounter}}\label{#1}}

\makeatletter
\newcommand{\sortitem}[2]{%
    \ifcsname r@#1\endcsname% Only expand once the \ref has been defined
        \dtlexpandnewvalue% <-- Added
    \fi
    \DTLnewrow{list}%
    \ifdefined\HyPsd@@@ref
        \DTLnewdbentry{list}{label}{\HyPsd@@@ref{#1}}%
    \else
        \DTLnewdbentry{list}{label}{\ref{#1}}%
    \fi
    \DTLnewdbentry{list}{description}{#2}%
}
\makeatother

\newenvironment{sortedlist}%
{%
    \DTLifdbexists{list}{\DTLcleardb{list}}{\DTLnewdb{list}}%
}%
{%
    \DTLsort{label}{list}%
    \begin{description}%
    \DTLforeach*{list}{\theLabel=label,\theDesc=description}{%
    \item[\theLabel] \theDesc
    }%
    \end{description}%
}


\begin{document}

\tablenotelabel{stars}
\tablenotelabel{galaxies}
\tablenotelabel{planets}

\begin{sortedlist}
    \sortitem{planets}{Some planets are inhabited.}
    \sortitem{galaxies}{Some galaxies are grand.}
    \sortitem{stars}{All stars ``burn'' hydrogen.}
\end{sortedlist}
\end{document}

verwandte Informationen