문서의 임의 지점에 파일 이름 '목록'을 만들고 부록에 있는 해당 목록을 사용하여 이 파일을 로드하고 싶습니다. 나는 레이아웃할 항목을 보관하기 위해 TeX에 목록에 대한 일반화된 개념이 있다는 것을 이해하지만 항목 목록에 유연하게 추가하고 나중에 이러한 항목을 반복하여 다음과 같이 해석하는 간단한 방법을 찾고 있습니다. '\입력{항목}'.
나는 조금 검색했지만 일치하는 것 같은 것은 아무것도 나오지 않았습니다. 이미 답변을 받으셨다면 링크를 따라가시면 됩니다.
편집: 답변을 살펴보면서 목록 항목을 고유하게 유지하는 것이 유용할 수 있다는 것을 깨달았습니다. 즉, 동일한 파일 이름을 두 번 추가하면 파일이 두 번 로드되지 않습니다. (합리적인 단순성 수준에서) 그게 가능할까요?
답변1
LaTeX 커널에는 다음을 기반으로 하는 표준 목록 관리가 있습니다 \@for
.
\makeatletter
\newcommand{\addtofilelist}[1]{%
\ifx\files@to@input@later\@empty
\g@addto@macro\files@to@input@later{#1}%
\else
\g@addto@macro\files@to@input@later{,#1}%
\fi
}
\let\files@to@input@later\@empty % initialize
\newcommand{\inputthefiles}{%
\@for\next:=\files@to@input@later\do{\input{\next}}%
}
\makeatother
그래서 당신은 말한다
\addtofilelist{foo.tex}
\addtofilelist{bar.tex}
당신이 원할 때 그리고 마지막에 당신은 발행할 수 있습니다
\inputthefiles
이는 필요에 따라 작동합니다.
기반 expl3
기술:
\usepackage{xparse}
\ExplSyntaxOn
\NewDocumentCommand{\addtofilelist}{m}
{
\seq_gput_right:Nn \g_regnirpsj_file_list_seq { #1 }
}
\NewDocumentCommand{\inputthefiles}{}
{
\seq_map_inline:Nn \g_regnirpsj_file_list_seq { \input{ ##1 } }
}
\seq_new:N \g_regnirpsj_file_list_seq
\ExplSyntaxOff
사용법은 동일합니다. 단일 명령으로 파일 목록을 추가하려면 \addtofilelist
첫 번째 정의를 다음으로 변경하십시오.
\NewDocumentCommand{\addtofilelist}{m}
{
\clist_map_inline:nn { #1 }
{
\seq_gput_right:Nn \g_regnirpsj_file_list_seq { ##1 }
}
}
언제든지 다음과 같이 말할 수 있습니다.
\addtofilelist{foo.tex, bar.tex}
쉼표로 구분된 파일 이름 수에 관계없이 사용할 수 있습니다. 이는 커널 기반 솔루션에서도 가능하지만 이 경우 공백은 허용되지 않지만 xparse
기반 솔루션에서는 쉼표 주위에서 공백이 무시됩니다.
답변2
이는 etoolbox
목록 유틸리티 등을 사용하여 수행할 수 있습니다.
예를 들어 \listgadd{\myfilelist}{}
목록의 초기화 프로그램으로 사용하세요.
그 후에는 '모든' 위치에서 \listgadd{\myfilelist}{file1}
또는 여러 파일에 사용됩니다 \forcsvlist{\listgadd{\myfilelist}}{file2, file3,file4}
.
부록의 모든 파일을 입력하려면 각 파일의 입력 전후에 일부 작업을 수행하는 래퍼 명령을 사용하는 것이 좋지만 다음과 같이 말하면 충분합니다.
\forlistloop{\input}{\myfilelist}
,
목록을 반복합니다.
모든 목록 반복자 매크로에 대한 첫 번째 인수는 etoolbox
현재 목록 요소를 마지막 인수로 가져오는 요소 루틴을 기대합니다.
\documentclass[12pt]{article}
\usepackage{etoolbox}%
\usepackage{blindtext}%
\listgadd{\myfilelist}{}%
\newcommand{\inputallfiles}[1]{%
\input{#1}%
}%
\begin{document}
\blindtext
\listgadd{\myfilelist}{file1}%
\blindtext[10]
\forcsvlist{\listgadd{\myfilelist}}{file2,file3,file1}%
\appendix%
\section{First}
\forlistloop{\inputallfiles}{\myfilelist}%
\end{document}
파일1.tex
\textit{Hello World}
파일2.tex
\textbf{Hello World}
파일3.tex
\textsc{Hello World}
OP가 고유한 목록 요소 추가를 요청함에 따라 -- 대체 버전
ifinlist
목록 요소 추가를 위해 래퍼 명령을 사용하면 etoolbox의 명령을 사용하여 '새' 요소가 목록에 이미 저장되어 있는지 확인할 수 있습니다 . 이 테스트 결과가 있으면 false
추가할 수 있으며, 그렇지 않으면 무시됩니다.
command
\addtofilelist
단일 요소 또는 쉼표로 구분된 요소 목록에도 작동하는 를 추가했습니다 .
매크로 에서는 안전성을 높이기 위해 \inputallfiles
테스트를 추가했습니다 \InputIfFileExists...
.
\documentclass[12pt]{article}
\usepackage{etoolbox}%
\usepackage{blindtext}%
\listgadd{\myfilelist}{}%
\newcommand{\uniqueaddtolist}[2]{%
\ifdef{#1}{%
\ifinlist{#2}{#1}{%
% Do nothing
}{%
\listgadd{#1}{#2}%
}
}{% No list so far, so just add one!
\listgadd{#1}{#2}%
}%
}%
\newcommand{\uniqueaddtofilelist}[1]{%
\uniqueaddtolist{\myfilelist}{#1}%
}%
\newcommand{\addtofilelist}[1]{%
\forcsvlist{\uniqueaddtofilelist}{#1}%
}%
\newcommand{\inputallfiles}[1]{%
\InputIfFileExists{#1}{}{}%
}%
\begin{document}
\blindtext
\addtofilelist{file1}%
\blindtext[10]
\addtofilelist{file2,file3,file1}%
\appendix%
\section{First}
\forlistloop{\inputallfiles}{\myfilelist}%
\end{document}