我正在使用 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)}