我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}