我将一张表格从 Google Sheet 复制到 a 中*.txt
,并想将其格式化为 pdf。
我可以把它分开
\loop\unless\ifeof\mytextfile
\read\mytextfile to\mytextline
所以我在每个循环中都有一个下一行。
现在我想从 gSheet 返回单个字段。在*.txt
文件中,它们是以制表符分隔的,我找不到返回制表符之间每个字符串的有效方法。
我找到了\findBetweenTabs{\mystring}
,但它不起作用。我总是得到一个空字符串。
你能帮帮我吗?应该没那么难吧?
编辑:我编写了一个 Python 代码,用字符串“aaabbb”替换制表符,那么,我现在可以在这些字符之间切换吗?\Str\Between 似乎不支持这样的多个字符串
答案1
readarray
以下是使用和包的方法listofitems
:
\begin{filecontents*}[overwrite]{junk.txt}
abc defgh ijk
lm nop qrstu vwxyz
\end{filecontents*}
\documentclass{article}
\usepackage{readarray,listofitems}
\begin{document}
\readarraysepchar{\\}
\readdef{junk.txt}\mydata
\setsepchar{\\/ }% <--TAB character (not SPACE)
\readlist\myrecordlist{\mydata}
3rd string of 2nd record is ``\myrecordlist[2,3]''.
Comma-separated strings for each file record are:\\
\foreachitem\z\in\myrecordlist[]{%
\ifnum\zcnt=1\else\newline\fi
\foreachitem\zz\in\myrecordlist[\zcnt]{%
\ifnum\zzcnt=1\else, \fi
\zz
}
}
DONE
\end{document}
我针对每个文件记录可能包含不同数量的字符串字段的情况定制了上述答案(listofitems
excels 适用于这种情况)。 如果事先确定每个文件记录都有相同数量的字符串字段,我的方法会略有不同(对于readarray
这种情况很有用,允许在格式化数组输出时使用更多选项,如以下 MWE 所示:
\begin{filecontents*}[overwrite]{junk.txt}
abc defgh ijk
lm nop qrstuvwxyz
\end{filecontents*}
\documentclass{article}
\usepackage{readarray}
\readarraysepchar{ }% <--TAB character (not SPACE)
\renewcommand\typesetrowsepchar{\\}
\renewcommand\typesetcolsepchar{&}
\begin{document}
\readdef{junk.txt}\mydata
\readarray\mydata\myrecordlist[-,\ncols]
3rd string of 2nd record is ``\myrecordlist[2,3]''.
\begin{tabular}{|c|c|c|}
\hline
\typesetarray\myrecordlist\\
\hline
\end{tabular}
DONE
\end{document}
答案2
这只是一个概念验证答案。您的问题并没有真正说明您想要实现什么,因此这只是一个排版两个表格的小示例(一个包含完整的文件内容,一个将内容缩减为两列)。可能还有更多可能,您可能需要阅读 的文档csvsimple
。
如果您需要的不仅仅是csvsimple
优惠,您还可以使用datatools
提供更多功能的套餐。
无论如何,这里有一个解析制表符分隔文件的小例子csvsimple
:
\documentclass{article}
\usepackage{csvsimple}
\begin{document}
\csvautotabular[separator=tab]{\jobname.txt}
\csvreader
[separator=tab, head to column names, tabular=ll, table head=Animal & Food\\]
{\jobname.txt}
{}
{\Animal & \Food}
\end{document}
答案3
谢谢您的回答。我使用以下方法解决了这个问题:
\newcommand{\extractText}[1]{%
\noindent% Neue Zeile
\def\tempText{#1}% Initialisiere den temporären Text
% Solange der temporäre Text nicht leer ist
\loop
% Extrahiere den Text zwischen den Zeichenfolgen "aaabbb"
\StrBehind{\tempText}{aaabbb}[\tempText]% Aktualisiere den temporären Text
\StrBefore{\tempText}{aaabbb}[\result]% Extrahiere den Teil vor "aaabbb"
% Überprüfe, ob es sich um das erste Element handelt, und formatiere es entsprechend größer
\ifnum\the\inputlineno=1\relax%
\textbf{\result}% Gib den extrahierten Teil in größerer Schrift aus
heyho
\else%
\result% Andernfalls gib den extrahierten Teil normal aus
\fi
% Falls der temporäre Text nicht leer ist, füge eine neue Zeile hinzu und fahre fort
\unless\ifx\tempText\empty%
\par% Neue Zeile
\fi
\ifx\tempText\empty\else\repeat% Solange der temporäre Text nicht leer ist
}
因此,使用循环对每一行进行遍历很容易