확장을 통해 얻은 값으로 카운터 설정

확장을 통해 얻은 값으로 카운터 설정

나는 glossariesminitoc패키지를 사용합니다. Minitocs는 목차에 인쇄된 모든 용어집에 대해 생성됩니다(예: toc용어집 패키지 옵션 사용). 장 앞에 용어집을 인쇄하면 아직 인쇄되지 않은 용어집의 미니톡이 장 대신 인쇄되어 장과 관련하여 미니톡이 효과적으로 오프셋됩니다.

mtc수동으로 이 문제는 minitoc의 카운터를 오프셋하여 해결할 수 있습니다 . 예 \addtocounter{mtc}{2}를 들어 용어집이 2개인 경우(예: 두문자어 + 실제 용어집)

패키지에 포함시키기 위해 자동으로 해당 교대를 수행하려고합니다. 첫 번째는 용어집 수를 가져오는 것입니다. 용어집 패키지는 매크로를 \@glo@types정의된 용어집 이름의 쉼표로 구분된 목록으로 정의합니다. 따라서
\expandafter\listLength\expandafter{\@glo@types}
다음을 사용하여 용어집 수를 인쇄할 수 있습니다.\listLength답변etoolbox를 사용하는 방법은 다음과 같습니다.

\makeatletter
\newcounter{listlength@cnt}
\newcommand*{\listlength@add}[1]{\stepcounter{listlength@cnt}}
\newcommand*{\listLength}[1]{%
    \setcounter{listlength@cnt}{0}%
    \forcsvlist{\listlength@add}{#1}%
    \thelistlength@cnt%
}
\makeatother

그러나 명령에 해당 값을 사용하려고 하면 addtocounter더 이상 작동하지 않습니다. 동일한 예의 경우:

  • \expandafter\listLength\expandafter{\@glo@types}2를 인쇄합니다.
  • \addtocounter{mtc}{\expandafter\listLength\expandafter{\@glo@types}}"번호 누락" 오류가 출력됩니다. 해당 명령 이전/에서 다양한 조합을 시도했지만 \expandafter이해하셨겠지만 확장 프로세스에 문제가 있습니다.

그렇다면 확장으로 파생된 값에 대한 카운터를 어떻게 상쇄할 수 있습니까?

MWE는 다음과 같습니다.

\documentclass{report}

\usepackage[nohints]{minitoc}
\usepackage{etoolbox}
\usepackage[acronym,xindy,toc]{glossaries}
    \makeglossaries

\begin{filecontents}{glossary.tex}
    \newacronym{nraa}{NRAA}{Not Really An Acronym}
    \newglossaryentry{stuff}{
      name={stuff},
      description={a test}%
    }
\end{filecontents}
\loadglsentries{glossary}

% macro to count args of csv-list
\makeatletter
\newcounter{listlength@cnt}
\newcommand*{\listlength@add}[1]{\stepcounter{listlength@cnt}}
\newcommand*{\listLength}[1]{%
    \setcounter{listlength@cnt}{0}%
    \forcsvlist{\listlength@add}{#1}%                        % from etoolbox
    \thelistlength@cnt%
}
\makeatother

\begin{document}
    \dominitoc            % Generating mini-toc
    \tableofcontents
    \glsaddall            % adding all glossary entries for the test
    \printglossary[type=\acronymtype]
    \printglossary[type=main]
    \addtocounter{mtc}{2} % manual offset
    \newpage
    \makeatletter
    number of glossaries:
    \expandafter{\expandafter\listLength\expandafter{\@glo@types} % prints 2
    %\addtocounter{mtc}{\expandafter\listLength\expandafter{\@glo@types}}
    % results in error, missing number
    \makeatother

    \chapter{chap1}
      chapter's toc is:
      \minitoc

      Content is:
      \section{s1}
        \subsection{s11}
\end{document}

답변1

귀하의 \listLength명령은 순수 확장으로는 작동하지 않습니다. 너는 말해야 해

\newcommand*{\listLength}[1]{%
    \setcounter{listlength@cnt}{0}%
    \forcsvlist{\listlength@add}{#1}%
}

\listLengthand then 의 정의에 따르면

\listLength{\@glo@types}%
\addtocounter{mtc}{\value{listlength@cnt}}%

코드에서.

다음과 같은 훨씬 더 매끄러운 방법이 있습니다 expl3.

\documentclass{report}

\usepackage[nohints]{minitoc}
\usepackage{xparse}
\usepackage[acronym,xindy,toc]{glossaries}
    \makeglossaries

\begin{filecontents}{glossary.tex}
    \newacronym{nraa}{NRAA}{Not Really An Acronym}
    \newglossaryentry{stuff}{
      name={stuff},
      description={a test}%
    }
\end{filecontents}
\loadglsentries{glossary}

% macro to count args of csv-list
\ExplSyntaxOn
\DeclareExpandableDocumentCommand{\listLength}{m}
 {
  \clist_count:n { #1 }
 }
\ExplSyntaxOff

\begin{document}
    \dominitoc            % Generating mini-toc
    \tableofcontents
    \glsaddall            % adding all glossary entries for the test
    \printglossary[type=\acronymtype]
    \printglossary[type=main]
    \addtocounter{mtc}{2}% manual offset
    \newpage
    number of glossaries:
    \makeatletter
    \listLength{\@glo@types} % prints 2
    \addtocounter{mtc}{\listLength{\@glo@types}}
    \themtc
    \makeatother

    \chapter{chap1}
      chapter's toc is:
      \minitoc

      Content is:
      \section{s1}
        \subsection{s11}
\end{document}

여기에 이미지 설명을 입력하세요

보시다시피 mtc코드가 실행된 후의 값은 3입니다.

명령 은 \clist_count:n완전히 확장 가능하지만 그렇지 \listLength않습니다.

관련 정보