按字母顺序对子部分进行排序

按字母顺序对子部分进行排序

我们需要写一篇论文来描述接口列表。但是作业要求我们需要按字母顺序对接口进行排序。因为这个列表很长(超过 20 个),所以我正在寻找一种方法来按字母顺序对子部分(每个子部分描述一个接口)进行排序。无需自己移动代码。

是否有一个包可以处理这个问题?

以下是代码示例:

\newcommand{\interfaceItem}[5]{
   \subsection{#1}\label{interfaceItem:#1}
   \paragraph{Paragraph 1}#2
   \paragraph{Paragraph 2}#3
   \paragraph{Paragraph 3}#4
   \paragraph{Paragraph 4}#5
}

答案1

这是一个实现:

\documentclass{article}
\usepackage{xparse}
\ExplSyntaxOn
\NewDocumentCommand{\interfaceItem}{mmmmm}
 {
  \seq_put_right:Nn \l_commusoft_interfaces_seq {#1}
  \cs_new:cpn { commusoft_interface_#1: } {
    \subsection{#1}\label{interfaceItem:#1}
    \paragraph{Paragraph 1}#2
    \paragraph{Paragraph 2}#3
    \paragraph{Paragraph 3}#4
    \paragraph{Paragraph 4}#5
  }
 }
\NewDocumentCommand{\printInterfaces}{ }
 {
  \seq_sort:Nn \l_commusoft_interfaces_seq
   {
    \string_compare:nnnTF {##1} {>} {##2} {\sort_return_swapped:} {\sort_return_same:}
   }
  \seq_map_inline:Nn \l_commusoft_interfaces_seq { \use:c { commusoft_interface_##1: } }
 }
\seq_new:N \l_commusoft_interfaces_seq
\prg_new_conditional:Npnn \string_compare:nnn #1 #2 #3 {TF}
  {
   \if_int_compare:w \pdftex_strcmp:D {#1}{#3} #2 \c_zero
    \prg_return_true:
   \else:
    \prg_return_false:
   \fi
  }
\ExplSyntaxOff

\interfaceItem{A}{A1}{A2}{A3}{A4}
\interfaceItem{C}{C1}{C2}{C3}{C4}
\interfaceItem{B}{B1}{B2}{B3}{B4}

\begin{document}

\printInterfaces

\end{document}

然而,更简单的策略可以更容易:

\makeatletter
\newcommand{\interfaceItem}[5]{
   \@namedef{interface@\detokenize{#1}}{%
     \subsection{#1}\label{interfaceItem:#1}
     \paragraph{Paragraph 1}#2
     \paragraph{Paragraph 2}#3
     \paragraph{Paragraph 3}#4
     \paragraph{Paragraph 4}#5
    }
}
\newcommand{\printInterface}[1]{%
  \@nameuse{interface@\detokenize{#1}}%
}
\makeatother

你可以像前面一样在序言中定义你的接口,

\interfaceItem{A}{A1}{A2}{A3}{A4}
\interfaceItem{C}{C1}{C2}{C3}{C4}
\interfaceItem{B}{B1}{B2}{B3}{B4}

然后说

\printinterface{A}

\printinterface{B}

\printinterface{C}

对短命令列表进行排序比对大块代码进行排序更容易。

答案2

TeX 是图灵完备语言,因此我相信这个问题可以“轻松”解决。但是,最好使用标准 Unix 工具(至少在 Unix 上)来完成此操作。创建一个目录接口您将在其中创建一个单独的.tex文件中每个接口的描述。例如

z-interface.tex
a-interface.tex
q-interface.tex
b-interface.tex

现在做类似的事情

ls interfaces > interface-names.txt

这将创建 interface-names.txt 文件,其中接口按字母顺序排序。使用 awk,您可以轻松地\input在每个文件名前面添加 TeX 命令。例如

awk '{print "\\input",$1}' interface-names.txt > interface-names.tex

现在只需输入以下行

\input interface-names.tex

进入你的主要.tex文件,你将拥有所有子部分,只要主文件.tex文件和接口.tex文件位于同一目录中。

相关内容