加载包含特殊字符的文件以供 readrecordarray 使用

加载包含特殊字符的文件以供 readrecordarray 使用

readrecordarray在这个答案中使用https://tex.stackexchange.com/a/582975/1403但我想包含文件名包含特殊字符的文件:下划线、逗号和括号。这些文件由另一个程序自动生成,我可以方便地按原样加载它们而无需重命名它们。

我怎样才能实现这个目标?

例如:文件名是file_7_{1,2,3},{2,3,4}.txt

答案1

我对你上一个问题的回答的新版本,它接受任意文件名并允许语法

\yngfile[<number>]{<filename>}

其中可选参数(默认为 1)指的是文件中的行号。

\begin{filecontents*}{file_7_{1,2,3},{2,3,4}.txt}
{1,2,3}
{2,3,4}
\end{filecontents*}

\documentclass{article}
\usepackage{youngtab}

\ExplSyntaxOn

\NewDocumentCommand{\yngfile}{O{1}m}
 {
  \stonek_yngfile:nn { #1 } { #2 }
 }

\prop_new:N \g_stonek_yngfile_prop
\tl_new:N \l__stonek_yngfile_tmp_tl
\ior_new:N \g__stonek_yngfile_ior
\int_new:N \l__stonek_yngfile_index_int
\cs_generate_variant:Nn \prop_item:Nn { Ne }

\cs_new_protected:Nn \stonek_yngfile:nn
 {
  \ior_open:Nn \g__stonek_yngfile_ior { #2 }
  \prop_if_in:NnF \g_stonek_yngfile_prop { #2 }
   {
    \prop_gput:Nxx \g_stonek_yngfile_prop { #2 } { } % just a marker
    \int_zero:N \l__stonek_yngfile_index_int
    \ior_map_inline:Nn \g__stonek_yngfile_ior
     {% the file has not yet been read in
      \int_incr:N \l__stonek_yngfile_index_int
      \prop_gput:Nxx \g_stonek_yngfile_prop
       {
        #2 @ \int_to_arabic:n { \l__stonek_yngfile_index_int }
       }
       {
        \__stonek_yngfile_fix:n ##1
       }
     }
   }
  \prop_item:Ne \g_stonek_yngfile_prop { #2 @ #1 }
 }
\cs_new:Nn \__stonek_yngfile_fix:n { \exp_not:N \yng(#1) }

\ExplSyntaxOff

\begin{document}

\yngfile[1]{file_7_{1,2,3},{2,3,4}.txt}\quad
\yngfile[2]{file_7_{1,2,3},{2,3,4}.txt}

\end{document}

与上一个答案一样,这允许重复使用表,而无需每次都重新读取文件。第一次找到文件名时,属性列表将以 形式填充数据\yng(<line contents without braces>),因此您可以在任何需要的地方调用表而无需进一步访问磁盘。

在此处输入图片描述

改进的版本可以\yngfile*{<filename>}打印所有图表并将\quad其彼此分开。

\begin{filecontents*}{file_7_{1,2,3},{2,3,4}.txt}
{1,2,3}
{2,3,4}
\end{filecontents*}

\documentclass{article}
\usepackage{youngtab}

\ExplSyntaxOn

\NewDocumentCommand{\yngfile}{sO{1}m}
 {
  \stonek_yngfile_process:n { #3 } % store the diagrams, if needed
  \IfBooleanTF { #1 }
   {
    \stonek_yngfile_print_all:n { #3 }
   }
   {
    \stonek_yngfile_print_one:nn { #3 } { #2 }
   }
 }

\prop_new:N \g_stonek_yngfile_prop
\tl_new:N \l__stonek_yngfile_tmp_tl
\ior_new:N \g__stonek_yngfile_ior
\int_new:N \l__stonek_yngfile_index_int
\cs_generate_variant:Nn \prop_item:Nn { Ne }

\cs_new_protected:Nn \stonek_yngfile_process:n
 {
  \ior_open:Nn \g__stonek_yngfile_ior { #1 }
  \prop_if_in:NnF \g_stonek_yngfile_prop { #1 }
   {
    \int_zero:N \l__stonek_yngfile_index_int
    \ior_map_inline:Nn \g__stonek_yngfile_ior
     {% the file has not yet been read in
      \int_incr:N \l__stonek_yngfile_index_int
      \prop_gput:Nxx \g_stonek_yngfile_prop
       {
        #1 @ \int_to_arabic:n { \l__stonek_yngfile_index_int }
       }
       {
        \__stonek_yngfile_fix:n ##1
       }
     }
    % store the number of tableaux
    \prop_gput:Nxx \g_stonek_yngfile_prop { #1 }
     {
      \int_to_arabic:n { \l__stonek_yngfile_index_int }
     }
   }
 }
\cs_new:Nn \__stonek_yngfile_fix:n { \exp_not:N \yng(#1) }

\cs_new:Nn \stonek_yngfile_print_one:nn
 {
  \prop_item:Nn \g_stonek_yngfile_prop { #1 @ #2 }
 }

\cs_new_protected:Nn \stonek_yngfile_print_all:n
 {
  \int_step_inline:nn { \prop_item:Nn \g_stonek_yngfile_prop { #1 } }
   {
    \prop_item:Nn \g_stonek_yngfile_prop { #1 @ ##1 }\quad
   }
   \unskip
 }

\ExplSyntaxOff

\begin{document}

\yngfile[1]{file_7_{1,2,3},{2,3,4}.txt}

\yngfile*{file_7_{1,2,3},{2,3,4}.txt}

\yngfile[2]{file_7_{1,2,3},{2,3,4}.txt}

\end{document}

在此处输入图片描述

相关内容