ローカル相互参照でカウンタラベルの非数値部分をスキップする

ローカル相互参照でカウンタラベルの非数値部分をスキップする

引用文の中で著者の言語例を引用する場合、著者名を指定する特別なラベルを使用するようにしています。(著者名は角括弧で囲みますが、ここでは関係がないため表示されません。)

複数の例やサブ例を参照する場合同じ著者によるこの特別な非数値ラベルをスキップして、数字のみを保持できるようにしたいと考えています。

\StrCut は、xstring著者名と番号の間にある改行できないスペースを削除するのに適しています。

ただし、区切り文字がない場合、cleveref\crefstripprefix を使用した通常の解決策は意図したとおりに機能しません。MWE を参照してください。

さらに、\StrCutでレベル2/レベル3の区切り文字を削除して、著者 1a.i--iii動作しますが、ロードされると重大なエラーが発生しますhyperref

範囲は特に必要ではないことを指摘しておきます。範囲は、mwe に示されているように、代替の「調整」アプローチを使用してすでに機能しています。

例を参照するときに著者名を省略できるようにしたいだけです。これにより、「著者 1a.ii、2b.i」などの範囲ではない複数の参照に必要な柔軟性が得られます。

コーディングのすべてのクレジットはここで確認できます: 相互参照: サブレベルとプリセットの追加


\documentclass{article}
\usepackage{philex} % Linguex wrapper. Awesome despite the "non-academic" coding.
\usepackage{xstring} % Provides the \StrCut command.
\usepackage{refcount} % Provides the \getrefbykeydefault command.
\usepackage{cleveref} % For ranges.


\setlength{\parskip}{1em}

\crefname{bpa}{}{} % Main Counter
\crefname{SubExNo}{}{} % Sublevel.
\crefname{SubSubExNo}{}{}

\newcommand{\dotstrip}[2]{\StrCut{#1}{.}{\onea}{\oneb}%
    \StrCut{#2}{.}{\twoa}{\twob}%
    \IfStrEq{\onea}{\twoa}{\twob}{#2}}

\newcommand{\spacestrip}[2]{\StrCut{#1}{~}{\onea}{\oneb}%
\StrCut{#2}{~}{\twoa}{\twob}%
\IfStrEq{\onea}{\twoa}{\twob}{#2}}

\crefrangelabelformat{bpa}{(#3#1#4--#5\spacestrip{#1}{#2}#6)} %   Stripping to the non-brakable space, so that Author is not repeated.
\crefrangelabelformat{SubExNo}{(#3#1#4--#5\crefstripprefix{#1}{#2}#6)} % Usually outputs 1a--b but does not work here.
\crefrangelabelformat{SubSubExNo}{(#3#1#4--#5\dotstrip{#1}{#2}#6)} % Used with roman numbering, which confuses crefstripprefix. But you need a separator (a dot in this variant).




\begin{document}

    % Philex Formatting
    
    \phildashes{}{.}        % Adds a dot between levels 2 and 3 in references.
    \subformat{a}{}{.}      % Level 2 is of the form “a.”
    \subsubformat{i}{(}{)}  % Level 3 is of the form “(i)”



\bpaformat{1}{Author~}{}

\lbpa{main1}{Example One.
    \lba{sub11}{Subexample One-One.
        \lba{subsub111}{Subsubexample One-One-One.}
        \lbb{subsub112}{Subsubexample One-One-Two.}
        \lbz{subsub113}{Subsubexample One-One-Three}}
    \lbz{sub12}{Subexample One-Two.
        \lba{subsub121}{Subsubexample One-Two-One.}
        \lbz{subsub122}{Subsubexample One-Two-Two.}}}

\lbpa{main2}{Example Two.}


When quoting different examples, I do not want \textit{Author} to be repeated.

Works very nicely with xstring's StrCut for the 1st level...

\crefrange{main1}{main2}

... but the 3rd does not work if hypperref is loaded :

\textbackslash crefrange\{subsub111\}\{subsub113\} yields a critical error.

\vspace{6pt}
... and more importantly, level 2 does not work at all because \textbackslash crefstripprefix fails:

\textbackslash crefrange\{sub11\}\{sub12\}  should output “Author 1a--b” but instead I get the following error :

“Improper alphabetic constant.”

\vspace{12pt}

Of course an alternative approach is to refer to “parts” so we can “cheat” and build the refs manually:
Philex already has \textbackslash rfx/rnx command to skip the main level.

Then we may define a new command to skip the first sublevel :



\makeatletter

    \@ifdefinable\gobbletodot{\long\def\gobbletodot#1.{}}% refcount package
    \newcommand\delbefdot[1]{%
      \ifcat$\detokenize\expandafter{\gobbletodot#1.}$%
      \expandafter\@firstoftwo\else\expandafter\@secondoftwo\fi
      {#1}{\expandafter\delbefdot\expandafter{\gobbletodot#1}}%
    }%
    \@ifdefinable\rfxx{%
      \DeclareRobustCommand\rfxx[1]{%
        \IfRefUndefinedBabel{#1}{\refused{#1}\nfss@text{\reset@font\bfseries??}}%
                            {%
                              \@ifundefined{hyperref}{\@firstofone}{\hyperref[{#1}]}%
                              {%
                                (\expandafter\expandafter\expandafter\delbefdot
                                \expandafter\expandafter\expandafter{\getrefbykeydefault{#1}{}{??}})%
                              }%
                            }%
      }%
    }%
    \@ifdefinable\rnxx{%
      \DeclareRobustCommand\rnxx[1]{%
        \IfRefUndefinedBabel{#1}{\refused{#1}\nfss@text{\reset@font\bfseries??}}%
                            {%
                              \@ifundefined{hyperref}{\@firstofone}{\hyperref[{#1}]}%
                              {%
                                \expandafter\expandafter\expandafter\delbefdot
                                \expandafter\expandafter\expandafter{\getrefbykeydefault{#1}{}{??}}%
                              }%
                            }%
      }%
    }%

\makeatother



\newcommand{\rfstrip}[2]{(\rn{#1}--\rnx{#2})}
\newcommand{\rfdoublestrip}[2]{(\rn{#1}--\rnxx{#2})}

\rfstrip{sub11}{sub12}
\rfdoublestrip{subsub111}{subsub113}

\vspace{6pt}

But we lose systematicity and besides, “Author 1a.i, 2b.”  is also something I would like.


\end{document}


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

答え1

@Ulrike Fischer の例示に感謝しますこここの素晴らしいパッケージの使い方についてはzref、元の投稿で私が提起した問題を解決する方法を簡単に説明しました。

ご覧のとおり、その後はすべてがずっと簡単になります。

(もちろん、\zlabel は、後者を含むすべての言語パッケージのどこでも \label を置き換える必要があるため、手動で追加する必要はありませんが、これは簡単です。)

\documentclass{report}
\usepackage{zref-user}
\usepackage{philex}

\setlength{\parskip}{1em}

\makeatletter
\zref@newprop{exno}{\arabic{ExNo}}
\zref@newprop{subexno}{\alph{SubExNo}}
\zref@newprop{subsubexno}{\roman{SubSubExNo}}

\zref@newprop{authorstrip}{\bota{bpa}\alph{SubExNo}{\ifnum\theExDepth=3\roman{SubSubExNo}\fi}} % Here is the key line.

\zref@newprop{refstrip}{\ifnum\theExDepth=3\roman{SubSubExNo}\else\alph{SubExNo}\fi}

\zref@addprops{main}{exno,subexno,subsubexno,authorstrip,refstrip}
\makeatother

\newcommand{\authorstrip}[2]{(\zref{#1},\,\zref[authorstrip]{#2})}

\newcommand{\rfxx}[1]{(\zref[subsubexno]{#1})}

\newcommand{\rfstrip}[2]{(\zref{#1}--\zref[refstrip]{#2})}

\begin{document}

\phildashes{}{.} 
\subformat{a}{}{.}     

\bpaformat{1}{Author~}{}

\lbpa{main1}{Example One.\zlabel{mainex}
    \lba{sub11}{Subexample One-One.\zlabel{sub11}
        \lba{subsub111}{Subsubexample One-One-One.}\zlabel{subsub111}
        \lbb{subsub112}{Subsubexample One-One-Two.}
        \lbz{subsub113}{Subsubexample One-One-Three.\zlabel{subsub113}}} 
    \lbz{sub12}{Subexample One-Two.\zlabel{sub12}
        \lba{subsub121}{Subsubexample One-Two-One.}
        \lbz{subsub122}{Subsubexample One-Two-Two.}}}

\lbpa{main2}{Example Two.
        \lba{sub21}{Subexample Two-One.}
        \lbz{sub22}{Subexample Two-Two.}} \zlabel{sub22}
        
\vspace{6pt}

Results :

\rfxx{subsub113}

\rfstrip{subsub111}{subsub113}

\rfstrip{sub11}{sub12}

\authorstrip{subsub111}{sub22}
\end{document}


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

編集:

コマンドの引数 3 に対応する Author Name 変数のみを抽出するには\bpaformat、後者の定義内に次のコマンドを追加するだけです。

\gdef\theauthor{#3}

コマンドは、\gdef任意のコマンドから任意の引数を抽出するのに非常に効果的な方法です。引数参照コード # によって変数にアクセスできるように、定義内で必ず使用してください。(どこは、左から右に数えた引数の順位です。

関連情報