读取数组中的输入单词然后逐个字符地进行处理

读取数组中的输入单词然后逐个字符地进行处理

对于某些应用程序,我需要逐字读取输入的 tex 文件(不一定作为任何命令的参数),然后根据某些条件更改单词内某些字符的位置后打印每个单词。例如,单词“eat”可能需要打印为“ate”或“tea”。LaTeX 中是否有这样的规定?

答案1

此代码定义了一个宏\InputSwap,它读取一个文件,按空格分割输入以组成单词,然后根据 处理每个单词\dilip_some_conditions:nnTF

条件函数\dilip_some_conditions:nnTF接受两个字母,并按其原始顺序或交换顺序返回它们。唯一正式的验证是用标点符号进行的。如果\c__dilip_punct_tl.,'/?;:!()[]默认情况下;随意添加更多)中的任何字符出现在被测试的字符对中,则它们将按相同顺序返回,否则它们将被随机交换。根据您希望满足的条件,您必须修改该\dilip_some_conditions:nnTF函数。

根据您想要交换字母的方式,您可能需要不同的代码,甚至可能\tl_sort:nN根本不需要代码。

使用一段Lorem ipsum作为输入,结果为:

在此处输入图片描述

代码如下:

\RequirePackage{filecontents}
\begin{filecontents*}{\jobname.words}
Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod
tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam,
quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo
consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse
cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non
proident, sunt in culpa qui officia deserunt mollit anim id est laborum.
\end{filecontents*}
\documentclass{article}
\usepackage{xparse}
\ExplSyntaxOn
\tl_new:N \l__dilip_input_tl
\NewDocumentCommand \InputSwap { O { \dilip_some_conditions:nnTF } m }
  { \dilip_input_swap:Nn #1 {#2} }
\cs_new_protected:Npn \dilip_input_swap:Nn #1 #2
  {
    \file_get:nnNTF {#2} {} \l__dilip_input_tl
      { \exp_args:NNV \__dilip_iterate_input:Nn #1 \l__dilip_input_tl }
      { \__kernel_msg_error:nnn { kernel } { file-not-found } {#2} }
  }
\cs_set:Npn \__dilip_tmp:w #1
  {
    \cs_new_protected:Npn \__dilip_iterate_input:Nn ##1 ##2
      { \__dilip_iterate_input:Nw ##1 ##2 #1 \q_recursion_tail #1 \q_recursion_stop }
    \cs_new_protected:Npn \__dilip_iterate_input:Nw ##1 ##2 #1
      { \tl_trim_spaces_apply:nN {##2} \__dilip_process_word:nN ##1 }
  }
\__dilip_tmp:w { ~ }
\cs_new_protected:Npn \__dilip_process_word:nN #1 #2
  {
    \quark_if_recursion_tail_stop:n {#1}
    \tl_sort:nN {#1} \dilip_some_conditions:nnTF
    \__dilip_continue:N #2
  }
\prg_new_conditional:Npnn \dilip_some_conditions:nn #1 #2 { TF }
  {
    \tl_if_in:NnTF \c__dilip_punct_tl {#1}
      { \prg_return_true: }
      {
        \tl_if_in:NnTF \c__dilip_punct_tl {#2}
          { \prg_return_true: }
          {
            \int_compare:nNnTF { \int_rand:nn {1} {2} } > { 1 }
              { \prg_return_true: }
              { \prg_return_false: }
          }
      }
  }
\tl_const:Nn \c__dilip_punct_tl { .,'/?;:!()[] }
\cs_new_protected:Npn \__dilip_continue:N #1 { \__dilip_iterate_input:Nw #1 }
\ExplSyntaxOff
\begin{document}
\InputSwap{\jobname.words}
\end{document}

相关内容