번호가 매겨진 TeX 코드 블록을 포함하는 데이터베이스 생성

번호가 매겨진 TeX 코드 블록을 포함하는 데이터베이스 생성

번호가 매겨진 TeX 코드 블록으로 구성된 데이터베이스를 만들고 싶습니다. 특히, 나는 새 항목을 어딘가에 저장하고 나중에 문서의 다른 부분에서 \mycommand{counterName}{Some text}사용하고 싶습니다. 문서에 텍스트를 삽입하기 위해 참조할 수 있는 카운터는 다음과 같습니다 Some Text.CounterName

\newcounter{a}
\mycommand{a}{The first line}
\stepcounter{a}
\mycommand{a}{The second line}

.........

print{2}

그리고 TeX는 "The second line"을 생성할 것입니다.

패키지 와 같은 것을 찾고 있지만 glossaries모든 목록을 한 번에 생성하는 것이 아니라 특정 항목을 생성하는 기능이 있어서 명령이 \print{n}단순히 명령의 텍스트로 대체되는 것처럼 보입니다 \mycommand{n}{TEXT}.

datatoolTeX.SX를 검색하면서 패키지와 코드 에 대한 답변을 찾았 Lua지만 적용할 수 있는 솔루션을 찾지 못했습니다.

datatool사용 방법 이나 glossaries이와 유사한 내용에 대한 간략한 설명을 정말 감사하겠습니다 .

답변1

datatool및 에 대해 언급하셨으므로 glossaries여기에 몇 가지 대안이 있습니다.

를 사용하는 datatool가장 간단한 방법은 모든 항목을 증분 순서로 정의하는 것입니다(카운터를 사용하지 않고). 행 번호는 인덱싱을 제공합니다.

\documentclass{article}

\usepackage{datatool}

\DTLnewdb{data}

\newcommand{\addline}[1]{%
  \DTLnewrow{data}%
  \DTLnewdbentry{data}{Text}{#1}%
}

\newcommand{\print}[1]{%
  \DTLgetvalue{\thisval}{data}{#1}{1}%
  \thisval
}

\addline{The first line}
\addline{The second line}

\begin{document}

Line 2: \print{2}.

All lines:

\DTLforeach*{data}{\Text=Text}{\DTLcurrentindex. \Text.\par}

\end{document}

이는 다음을 생성합니다.

문서 이미지

2번째 줄: 두 번째 줄입니다.
모든 줄:
1. 첫 번째 줄.
2. 두 번째 줄.

카운터를 사용하여 항목을 순서대로 정의하려는 경우 추가 열을 사용하여 수행할 수 있습니다.

\documentclass{article}

\usepackage{datatool}

\DTLnewdb{data}

\newcommand{\addline}[2]{%
  \DTLnewrow{data}%
  \dtlexpandnewvalue
  \DTLnewdbentry{data}{Index}{\the\value{#1}}%
  \dtlnoexpandnewvalue
  \DTLnewdbentry{data}{Text}{#2}%
}

\newcommand{\print}[1]{%
  \dtlgetrowindex{\thisrowidx}{data}{1}{#1}%
  \ifx\thisrowidx\dtlnovalue
    Not found!%
  \else
     \DTLgetvalue{\thisval}{data}{\thisrowidx}{2}%
     \thisval
  \fi
}

\newcounter{a}
\setcounter{a}{2}
\addline{a}{The second line}

\setcounter{a}{1}
\addline{a}{The first line}

\begin{document}

Line 2: \print{2}.

All lines:

\DTLforeach*{data}{\theIndex=Index,\Text=Text}{\theIndex. \Text.\par}

\end{document}

이는 다음을 생성합니다.

문서 이미지

2번째 줄: 두 번째 줄입니다.
모든 줄:
2. 두 번째 줄.
1. 첫 번째 줄.

이제 목록은 숫자 순서가 아니지만 블록이 정의된 순서와 일치합니다. 목록을 표시하기 전에 정렬할 수 있습니다.

\DTLsort{Index}{data}
\DTLforeach*{data}{\theIndex=Index,\Text=Text}{\theIndex. \Text.\par}

문서 이미지

2번째 줄: 두 번째 줄입니다.
모든 줄:
1. 첫 번째 줄.
2. 두 번째 줄.

접근 방식 은 다음과 같습니다 glossaries.

\documentclass{article}

\usepackage{glossaries-extra}

\glssetexpandfield{name}

\newcommand{\addline}[2]{%
  \edef\thisidx{\the\value{#1}}%
  \newglossaryentry{\thisidx}{name={\thisidx},description={#2}}%
}

\newcommand{\print}[1]{%
  \glsentrydesc{#1}%
}

\newcounter{a}
\setcounter{a}{2}
\addline{a}{The second line}

\setcounter{a}{1}
\addline{a}{The first line}

\begin{document}

Line 2: \print{2}.

All lines:

\renewcommand{\glstreenamefmt}[1]{#1}
\renewcommand{\glossarysection}[2][]{}
\printunsrtglossary[style=index]

\end{document}

이는 다음을 생성합니다.

문서 이미지

다시 정의 순서대로 나열됩니다. 목록을 정렬하려면 다음을 대신 사용할 수 있습니다.

\documentclass{article}

\usepackage[automake,nopostdot]{glossaries}

\makeglossaries

\glssetexpandfield{name}

\newcommand{\addline}[2]{%
  \edef\thisidx{\the\value{#1}}%
  \newglossaryentry{\thisidx}{name={\thisidx},description={#2}}%
}

\newcommand{\print}[1]{%
  \glsentrydesc{#1}\glsadd{#1}%
}

\newcounter{a}
\setcounter{a}{2}
\addline{a}{The second line}

\setcounter{a}{1}
\addline{a}{The first line}

\begin{document}

Line 2: \print{2}.

All lines:

\renewcommand{\glstreenamefmt}[1]{#1}
\renewcommand{\glossarysection}[2][]{}
\printglossary[style=index,nonumberlist]

\end{document}

이는 다음을 생성합니다.

문서 이미지

2번째 줄: 두 번째 줄입니다.
모든 라인:
2 두 번째 라인

이 목록에는 (를 사용하여) 색인이 생성된 항목만 나열됩니다 \glsadd. 모든 항목을 나열하려면 \glsaddall(모든 항목이 정의된 후)를 사용하십시오.

\documentclass{article}

\usepackage[automake,nopostdot]{glossaries}

\makeglossaries

\glssetexpandfield{name}

\newcommand{\addline}[2]{%
  \edef\thisidx{\the\value{#1}}%
  \newglossaryentry{\thisidx}{name={\thisidx},description={#2}}%
}

\newcommand{\print}[1]{%
  \glsentrydesc{#1}%
}

\newcounter{a}
\setcounter{a}{2}
\addline{a}{The second line}

\setcounter{a}{1}
\addline{a}{The first line}

\glsaddall

\begin{document}

Line 2: \print{2}.

All lines:

\renewcommand{\glstreenamefmt}[1]{#1}
\renewcommand{\glossarysection}[2][]{}
\printglossary[style=index,nonumberlist]

\end{document}

이는 다음을 생성합니다.

문서 이미지

2번째 줄: 두 번째 줄입니다.
모든 라인:
1 첫 번째 라인
2 두 번째 라인

확장

인덱싱 값을 저장하기 전에 완전히 확장하는 것이 중요합니다 \the\value{#1}. 그렇지 않으면 카운터 값이 변경될 때 계속 변경됩니다. 두 가지 모두 datatoolglossaries항목을 추가/정의할 때 확장을 켜거나 끄는 방법이 있습니다.

의 경우 를 datatool사용하여 확장을 켭니다 \dtlexpandnewvalue. 의 경우 다음을 glossaries사용하여 특정 필드에 대한 확장이 켜집니다.\glssetexpandfield{필드 라벨}.

의 마지막 인수에 추가하려는 코드에는 \addline깨지기 쉬운 명령이 포함될 수 있으며, 이 경우 값을 확장하지 않는 것이 중요합니다. 를 사용하면 을 datatool사용하여 확장이 다시 꺼집니다 \dtlnoexpandnewvalue. 를 사용하면 glossaries값이 키에 저장되고 description해당 필드에 대한 확장은 기본적으로 꺼져 있습니다.

답변2

다음은 다음과 같은 가정을 기반으로 합니다.\printlistitem다음은 발생하는~ 후에 \addlistitem:

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

\documentclass{article}

\usepackage{xparse}

\newcounter{listitem}
\NewDocumentCommand{\addlistitem}{o m}{%
  \IfValueTF{#1}
    {\expandafter\def\csname #1-list\endcsname{#2}}
    {\stepcounter{listitem}%
     \begingroup\edef\x{\endgroup\noexpand\expandafter
       \def\noexpand\csname \thelistitem-list\noexpand\endcsname}%
       \x{#2}}%
}

\newcommand{\printlistitem}[1]{%
  \ifcsname #1-list\endcsname
    \csname #1-list\endcsname
  \else
    Item~#1 does not exist.
  \fi
}

\begin{document}

\addlistitem{The first line}% 1
\addlistitem[B]{The second line}% C
\addlistitem{The third line}% 2

\printlistitem{2}

\printlistitem{1}

\printlistitem{3}

\printlistitem{B}

\end{document}

오류 검사/처리 및 역참조 처리를 위한 수정( \label- \ref설정 사용)을 포함하여 더 많은 수정 사항을 추가할 수 있습니다.


\printallitemsToC 형식으로 추가한 모든 항목을 나열하려면 을 추가하는 것이 좋습니다 . 다음 예에서는 각각 \addlistitem\section. 필요에 따라 프레젠테이션을 수정할 수 있습니다.

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

\documentclass{article}

\usepackage{xparse,tocloft}

\newcounter{listitem}
\NewDocumentCommand{\addlistitem}{o m}{%
  \IfValueTF{#1}
    {\expandafter\def\csname #1-list\endcsname{#2}%
     \addcontentsline{los}{listitem}{\protect\numberline{#1} #2}}
    {\stepcounter{listitem}%
     \begingroup\edef\x{\endgroup\noexpand\expandafter
       \def\noexpand\csname \thelistitem-list\noexpand\endcsname}%
       \x{#2}%
     \addcontentsline{los}{listitem}{\protect\numberline{\thelistitem} #2}}%
}

\newcommand{\printlistitem}[1]{%
  \ifcsname #1-list\endcsname
    \csname #1-list\endcsname
  \else
    Item~#1 does not exist.
  \fi
}

\makeatletter
\let\l@listitem\l@section
\newcommand{\printallitems}{{%
  \renewcommand{\cftsecfont}{\mdseries}% Add more ToC-related tuning here
  \@starttoc{los}}}
\makeatother

\begin{document}

\printallitems

\bigskip

\addlistitem{The first line}% 1
\addlistitem[B]{The second line}% C
\addlistitem{The third line}% 2

\printlistitem{2}

\printlistitem{1}

\printlistitem{3}

\printlistitem{B}

\end{document}

관련 정보