使用内循环中的周围列表项来输入复合文件名(forarray 包)

使用内循环中的周围列表项来输入复合文件名(forarray 包)

我正在尝试编写一份文档,其中一个部分由多个小部分组成(每个我想要报告的主题一个),每个小部分由不同数量的小部分组成(根据主题而变化)。

由于主题的数量以及子部分的数量将来可能会发生变化,因此我需要使该过程自动化。

理想情况下,我需要实现的是

伪代码

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.tex3_a.tex1_b.tex2_b.tex3_b.tex1_c.tex2_c.tex3_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可以使用 引用外部循环的当前项)。

在此处输入图片描述

相关内容