将括号内的导入列表转换为圆括号内的列表

将括号内的导入列表转换为圆括号内的列表

我正在使用 Macaulay2 进行一些计算并导出一个包含数字列表的 text.txt 文件,例如形式为 {1,2,3}。

我还想将该列表输入到我的 tex 文件中,但我需要将其放在普通括号内。它将由 youngtab 包中的“yng”命令使用。

所以我希望我的 tex 文件执行 \yng(1,2,3),但我不知道该怎么做,因为如果我执行 \input{text.txt} 我会得到 {1,2,3}:我不想要那里的括号。

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

编辑:看来史蒂文比我更早地看到了我未来想做的事情!更进一步的是,如果我可以输入一个每行都有一个这样的列表的文本文件,并且 LaTeX 会自动从每一行中生成 Young 的画面,那就太好了。

答案1

如果text.txt文件有多个条目,每个记录一个,那么可以将它们作为数组元素进行访问:

\documentclass{article}
\usepackage{youngtab,readarray}
\newcommand\yngalt[1]{%
  \def\tmpA{\yng(}%
  \edef\tmpB{#1}%
  \expandafter\tmpA\tmpB)%
}
\begin{filecontents*}{text.txt}
{1,2,3}
{2,3,4}
{4,1,3,5}
\end{filecontents*}
\begin{document}
\readrecordarray{text.txt}\myyng
3rd entry: \yngalt{\myyng[3]}

2nd entry: \yngalt{\myyng[2]}
\end{document}

在此处输入图片描述

如果文件中始终只有一个支撑列表text.txt,则可以采用以下替代方法:

\documentclass{article}
\usepackage{youngtab,readarray}
\newcommand\yngalt[1]{%
  \readdef{text.txt}\myyng
  \expandafter\yngaltaux\myyng }
\def\yngaltaux#1 {\yng(#1)}
\begin{filecontents*}{text.txt}
{4,1,3,5}
\end{filecontents*}
\begin{document}
THE entry: \yngalt{text.txt}
\end{document}

补充

通过循环遍历文件中的所有条目来处理它:

\documentclass{article}
\usepackage{youngtab,readarray}
\newcommand\yngalt[1]{%
  \def\tmp{\yng(}%
  \expandafter\expandafter\expandafter\tmp#1)}

\begin{filecontents*}[overwrite]{text.txt}
{1,2,3}
{2,3,4}
{4,1,3,5}
\end{filecontents*}
\begin{document}
\readarraysepchar{,}
\readdef{text.txt}\myyngdata
\readlist*\myyng{\myyngdata}

Loop:\\
\foreachitem\z\in\myyng[]{\ifnum\zcnt=1\else
  \the\numexpr\zcnt-1\relax: 
  \yngalt{\myyng[\zcnt-1]}\\[3pt]\fi}

2nd entry: \yngalt{\myyng[2]}
\end{document}

在此处输入图片描述

答案2

按照 Werner 的建议使用catchfile,但略有不同:

\begin{filecontents*}{\jobname-1.yt}
{1,2,3}
\end{filecontents*}

\documentclass{article}
\usepackage{youngtab}
\usepackage{catchfile}

\newcommand{\yngfile}[1]{%
  \CatchFileDef{\yngfiledef}{#1}{}%
  \expandafter\makeyngfile\yngfiledef
}
\newcommand{\makeyngfile}[1]{\yng(#1)}

\begin{document}

\yngfile{\jobname-1.yt}

\end{document}

因此,您可以拥有任意数量的文件。但是,每当您需要相同的表时,这都会读取磁盘。

\begin{filecontents*}{\jobname-1.yt}
{1,2,3}
\end{filecontents*}

\documentclass{article}
\usepackage{youngtab}
\usepackage{catchfile}

\newcommand{\yngfile}[1]{%
  \ifcsname yngfiledef@#1\endcsname
    % the file has already been loaded
  \else
  \CatchFileDef\temporaryyngfile{#1}{}%
  \global\expandafter\let\csname yngfiledef@#1\endcsname\temporaryyngfile
  \fi
  \expandafter\expandafter\expandafter\makeyngfile\csname yngfiledef@#1\endcsname
}
\newcommand{\makeyngfile}[1]{\yng(#1)}

\begin{document}

\yngfile{\jobname-1.yt}\quad\yngfile{\jobname-1.yt}

\end{document}

如果我使用该-recorder选项进行编译,我会看到该文件只被加载一次。

在此处输入图片描述

版本expl3

\begin{filecontents*}{\jobname-1.yt}
{1,2,3}
\end{filecontents*}

\documentclass{article}
\usepackage{youngtab}

\ExplSyntaxOn

\NewDocumentCommand{\yngfile}{m}
 {
  \stonek_yngfile:n { #1 }
 }

\prop_new:N \g_stonek_yngfile_prop
\tl_new:N \l__stonek_yngfile_tmp_tl

\cs_new_protected:Nn \stonek_yngfile:n
 {
  \prop_if_in:NnF \g_stonek_yngfile_prop { #1 }
   {% the file has not yet been read in
    \file_get:nnN { #1 } { } \l__stonek_yngfile_tmp_tl
    \prop_gput:Nnx \g_stonek_yngfile_prop { #1 }
     {
      \exp_last_unbraced:NV \__stonek_yngfile_fix:n \l__stonek_yngfile_tmp_tl
     }
   }
  \prop_item:Nn \g_stonek_yngfile_prop { #1 }
 }
\cs_new:Nn \__stonek_yngfile_fix:n { \exp_not:N \yng(#1) }

\ExplSyntaxOff

\begin{document}

\yngfile{\jobname-1.yt}\quad\yngfile{\jobname-1.yt}

\end{document}

答案3

您可以使用以下方式将文件内容捕获到宏中catchfile(比如说\temp,变成),然后通过使用它作为另一个宏的参数来修剪括号,并用以下括号替换它

\def\tempa#1{\def\temp{(#1)}}% Add parentheses around #1
\expandafter\tempa\temp% Update \temp

在此处输入图片描述

\documentclass{article}

\begin{filecontents*}[overwrite]{temp.txt}
{1,2,3}
\end{filecontents*}

\usepackage{catchfile,youngtab}

% \CatchFileDef{<cmd>}{<file>}{<setup>}
\CatchFileDef{\temp}{temp.txt}{}
\def\tempa#1{\def\temp{(#1)}}% Macro to add parentheses around #1
\expandafter\tempa\temp% Update \temp

\begin{document}

\expandafter\yng\temp

\end{document}

由于您正在编写源文件temp.txt,因此您也可以将所需的任何 LaTeX 命令作为输出的一部分。例如,输出

\something{1,2,3}
\something{4,1,3,2}
\something{1,3,5,7}
% ...and so on...

允许您将 LaTeX “钩子”(或宏)附加到每个“表格序列”。现在您可以添加

\newcommand{\something}[1]{\yng(#1)}

在你的序言中,只需调用

\input{temp.txt}

在文档中您想要的位置全部表格中的元素temp.txt将出现。也就是说,不需要逐个循环每个元素并打印它,因为\input只会将整个文件放入输入流中。

如果你需要表格之间的垂直间隙,也许使用

\newcommand{\something}[1]{\par\addvspace{\medskipamount}\yng(#1)}

相关内容