評価された参照をこのソート ルーチンに入力するにはどうすればよいでしょうか?

評価された参照をこのソート ルーチンに入力するにはどうすればよいでしょうか?

以下は、ネット上で見つけた例から私がまとめたコードです。ソートされたリスト ルーチンでは、\ref のリテラル引数を使用するのではなく、\ref の評価結果を使用するようにしたいと思います。

残念ながら、これは正しい順序で行われていないか、ソート ルーチンが複数の \ref インスタンスの評価結果を記憶していません。

ご意見は?

            \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}

答え1

を使って\dtlexpandnewvalueを拡張することができます。ただし、これは が定義され、.aux ファイルが作成された後にのみ実行できます。したがって、以下は が定義された後の出力です。\ref\sortitem\ref2回目の実行:

ここに画像の説明を入力してください

間にファーストラン次のように表示されます。

ここに画像の説明を入力してください

ノート:

  • を で使用できるようにするには、が定義されているかどうか ( 使用されている を指す)hyperrefを確認し、定義されている場合はの代わりにを使用します。\HyPsd@@@refhyperref\HyPsd@@@ref\ref

コード:

\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}

関連情報