我正在尝试编写一份文档,其中一个部分由多个小部分组成(每个我想要报告的主题一个),每个小部分由不同数量的小部分组成(根据主题而变化)。
由于主题的数量以及子部分的数量将来可能会发生变化,因此我需要使该过程自动化。
理想情况下,我需要实现的是
伪代码
foreach \section in {a,b,c}{
\section{section}
foreach \subsection in {1,2,3}{
\subsection{\subsection}
\input{file}
}
}
在哪里文件是由以下项组成的复合名称\subsection\textunderscore\section.tex
我找到了几个建议。我认为最适合我需要的是这个\ForEach 因下划线而失败。但是,我找不到访问外循环项的方法,以将 levelitem 包含到内循环中的名称中,即定义我想要输入的文件名称的第一部分。
我对乳胶中的循环还比较陌生(并且在一定程度上也对乳胶不太熟悉),所以我肯定遗漏了一些东西。
我只能让第一个循环工作。解决方案可能在于命令\ForEachSublevel
,但即使阅读forarray 手册,我还没能想出解决办法。
下面是我的代码
\documentclass[a4paper,11pt]{article}
% Packages
\usepackage[margin=2.5cm]{geometry}
\usepackage[stable]{footmisc}
\usepackage{caption}
\usepackage{subcaption}
\usepackage{float}
\usepackage{amsmath}
\usepackage{amssymb}
\usepackage{amsfonts}
\usepackage{setspace}
\usepackage{enumitem}
\usepackage{booktabs}
\usepackage[para]{threeparttable}
\usepackage{tabularx}
\usepackage{ragged2e}
\usepackage{graphicx}
% ----------------------------
% FORARRRAY TO LOOP WITH UNDERSCORES
% https://tex.stackexchange.com/questions/456693/foreach-fails-with-underscores
\usepackage{forarray}
\newif\iffilename
\global\filenamefalse
\makeatletter
\newcommand\myunderscore{%
\iffilename
\expandafter\@firstoftwo
\else
\expandafter\@secondoftwo
\fi{\string_}{\textunderscore}%
}%
\makeatother
% -----------------------------
\usepackage{bookmark}
\usepackage[T1]{fontenc}
\usepackage[latin1]{inputenc}
\usepackage{natbib}
% ------------------------------------------
\begin{document}
\section{Results}
% https://tex.stackexchange.com/questions/456693/foreach-fails-with-underscores
\ForEach{,}%
{%
{% Open local scope
\subsection{SYNTH OUTCOME ON \thislevelitem \hspace{1pt} OUTCOME}%
}% Ends local scope
}% ForEach ends here
{%
ipc\myunderscore ruleoflaw,ipc\myunderscore politicalrights,ipc\myunderscore gender,ipc\myunderscore socprotection,ipc\myunderscore business,ipc\myunderscore health,ipc\myunderscore work,ipc\myunderscore edu,ipc\myunderscore security,ipc\myunderscore environment,ipc\myunderscore minority,ipc\myunderscore cvrights,ipc\myunderscore womenrights,ipc\myunderscore corrupt% Needed comment
}%
\end{document}
答案1
欢迎来到 TeX.SE!我相信你想要这样的东西:
\documentclass{article}
\usepackage{expl3}
\ExplSyntaxOn
\cs_new_eq:NN \clistmapinline \clist_map_inline:nn
\ExplSyntaxOff
\begin{document}
\clistmapinline{a, b, c}{%
\section{Section #1}%
\clistmapinline{1, 2, 3}{%
\subsection{Subsection ##1}%
\input{##1_#1.tex}%
}%
}
\end{document}
这 将读取以下文件:1_a.tex
,,,,,,,,和。2_a.tex
3_a.tex
1_b.tex
2_b.tex
3_b.tex
1_c.tex
2_c.tex
3_c.tex
\clistmapinline
#1
用正在迭代的内容替换,并##
用单个替换#
。因此,当外循环展开时,##1
内循环代码中出现的所有都变成了#1
。这就是为什么内层代码可以使用访问其当前项,##1
并使用访问外层当前项的原因#1
。
\textunderscore
用于排版。对于要输入的文件名的一部分的下划线,您需要一个普通的下划线。
这是每个输入文件中包含明显虚拟内容的输出。
答案2
以下是目录列表:
Results_ipc_politicalrights.tex
Results_ipc_ruleoflaw.tex
Statements_ipc_politicalrights.tex
Statements_ipc_ruleoflaw.tex
santi.aux
santi.log
santi.pdf
santi.tex
为简单起见,我将文件列表缩减为两个。模拟文件只包含不带ipc
下划线的文件名。
代码:
\documentclass{article}
\usepackage[T1]{fontenc}
\usepackage{xparse}
\ExplSyntaxOn
\NewDocumentCommand{\cycle}{mm}
{
\santi_cycle:nn { #1 } { #2 }
}
\int_new:N \g__santi_cycle_int
\cs_generate_variant:Nn \clist_map_function:nN { nc }
\cs_new_protected:Nn \santi_cycle:nn
{
\int_gincr:N \g__santi_cycle_int
\cs_set:cn { \__santi_cycle_name: } { #2 }
\clist_map_function:nc { #1 } { \__santi_cycle_name: }
\int_gdecr:N \g__santi_cycle_int
}
\cs_new:Nn \__santi_cycle_name:
{
__santi_cycle_\int_to_roman:n { \g__santi_cycle_int } :n
}
\ExplSyntaxOff
\begin{document}
\cycle{Statements,Results}{%
\section{#1}
\cycle{
ipc\string_ruleoflaw,
ipc\string_politicalrights,
%ipc\string_gender,
%ipc\string_socprotection,
%ipc\string_business,
%ipc\string_health,
%ipc\string_work,
%ipc\string_edu,
%ipc\string_security,
%ipc\string_environment,
%ipc\string_minority,
%ipc\string_cvrights,
%ipc\string_womenrights,
%ipc\string_corrupt
}{
\subsection{SYNTH OUTCOME ON ##1 OUTCOME}
\input{#1_##1}
}
}
\end{document}
假设您有名为
<section>_ipc_<subsection>.tex
适应您的需求。
该\cycle
宏循环遍历作为第一个参数给出的列表,执行第二个参数中指定的内容,其中#1
代表当前项。此代码可以包含另一个\cycle
,但其第二个参数必须引用内部循环的当前项##1
(#1
可以使用 引用外部循环的当前项)。