
我對 tex 很陌生,但現在我必須:
- 編譯多個具有相同佈局的 pdf(如果物理上分開在不同的文件中或就像一個文件中的頁面一樣,則不太重要)
- 來自基於表格的資料庫的 1 列數據(目前有一個Excel表,其中包含:英語+德語,包含定義,+圖片)(資料是由其他人填寫的,並且每隔幾個月就會改變)
- 和與圖片相連(文本中解釋的內容,因此兩列在第三列中具有相同的圖片)
在這裡搜尋問題,我發現了幾種使用 .csv 檔案、photon 和 luatex 的解決方案(例如:將資料從電子表格匯入到 Latex 中,並為 LaTeX 中的每一行建立多個 pdf 文件 ) - 所有我從未聽說過的東西;)但我願意學習。我會根據需要解決這些問題。問題是,我現在不知道從哪裡開始。而且我有一種感覺,圖片將是一個問題,因為圖片不包含在Excel的單元格中,所以它們不會以任何方式被讀取。因此,我可能必須先對錶格使用完全不同的工具。然後無論如何都會有一種完全不同的方式。
所以我的問題是:
- 應該使用哪個程式來產生表格(其他人會這樣做,所以對他們來說不應該太複雜或昂貴,如果可能的話,像excel這樣簡單和常見的東西會很棒)
- 然後當然如何開始將其引入乳膠 - 你不需要再次給我一個已經給出的答案,我願意閱讀這裡已經存在的問題和答案,但有太多並且我的知識有限關於這一切,如果能得到嘗試給出的答案中的哪個提示,那就太好了。
- 並更改 .tex 檔案中最終 pdf 的佈局仍然是可能的,但我想這適用於每個解決方案。
我希望我能把我的問題說清楚。非常感謝你的幫忙!
答案1
使用 datatool 套件找到了解決方案。它還不完美,但您可能有一些改進的想法?
我將所有圖片放在一個資料夾中並使用
ls /b *.jpeg >pix.csv
產生所有圖片的 .csv。 (在 Mac 上工作)
然後我將其和我想要使用的列(在儲存為 .csv 之前)載入到我的 .tex 中並合併它們。
最後,我為每一行運行一個 tikzpicture 來產生單張卡片。
\documentclass{standalone}
\usepackage{graphicx}
\usepackage{tikz}
\usepackage{datatool}
\DTLloaddb[
noheader,
keys={name}
]{pix}{pix.csv}
\DTLloaddb[
noheader,
keys={title}
]{text}{text.csv}
\begin{document}
\newcount\rowIdx
\dtlforcolumn{\secondC}{text}{title}%\dtlforcolumn{?cs?}{?db?}{?key?}{?body?}
{
% iterate through each entry in the `title' column of the text database
\advance\rowIdx by 1\relax
% get corresponding row of pix database
\dtlgetrow{pix}{\rowIdx}%
% append to current row (this new column is assigned the key `title')
\dtlappendentrytocurrentrow{title}{\secondC}%\dtlappendentrytocurrentrow{?key?}{?value?}
% update first database
\dtlrecombine
}
\DTLforeach*%\DTLforeach*[?condition?]{?db name?}{?assign list?}{?text?}
[\not\DTLiseq{\Name}{main.tex}]
{pix}{\Name=name,\Title=title}{
\newpage
\begin{tikzpicture}[remember picture,overlay]
\node[anchor=south,inner sep=0pt] (icon) at (7.4,-8.5){\includegraphics[height=5cm]{\Name}}; %inserting the picture according to name
\node[inner sep=0,text width=\paperwidth,align=flush center] (text) at (7.4,-9){\Title};
\end{tikzpicture}
}
\end{document}
有一些錯誤,在 \end{tikzpicture} 行中缺少 \endgroup 和 },最後它說有很多 } 但我不明白為什麼?如果我在 .tex 中寫下 \endgroup ,它會說它太多了。所以它是這樣工作的,因為缺少的部分會自動添加,但我總是必須按 Enter 才能接受更改。也許你們中的一個人可以在這裡提供幫助。
多謝!
答案2
上面的答案僅適用於一種語言,但現在我的解決方案適用於兩種語言(帶有字幕),就像問題和等級選項中所問的那樣。製作表格的人必須在最後一列中寫入圖片的檔案名,而不是放置圖片,然後就可以正常工作了。
\documentclass[english]{article}
\usepackage[paperwidth=11cm, paperheight=10.4cm]{geometry}
\usepackage{graphicx}
\usepackage{tikz}
\graphicspath{{../pix/}}
\usepackage{datatool}
\usepackage{etoolbox}
\newbool{GER}
%\booltrue{GER} % if german version activate
\newcommand{\Levelgew}{1} % say which level (if you say level 2 it will print level1+2)
\DTLsetseparator{;}
\DTLloaddb[keys={level,eng,engunderline,ger,gerunderline,name}]{cards}{_scrumflowcards.csv} %\DTLloadrawdb[?options?]{?db name?}{?filename?}
\begin{document}
\ifbool{GER}
{
\DTLforeach*%\DTLforeach*[?condition?]{?db name?}{?assign list?}{?text?}
[\not\DTLisgt{\Level}{\Levelgew}]
{cards}{\Level=level,\Title=ger,\Underline=gerunderline,\Name=name}
{
\clearpage%start a new page for each row
\thispagestyle{empty}%get rid of the pagenumbers
\begin{tikzpicture}[remember picture,overlay]
\node[yshift=-2.2cm,anchor=south] (icon) at (current page.center) {\includegraphics[height=6cm]{\Name}};
\node[yshift=-3.5cm,text width=8cm,align=flush center] (text) at (current page.center){\huge\bfseries\sffamily\Title\\[15pt]
\LARGE \Underline};
\end{tikzpicture}
}
}{
\DTLforeach*%\DTLforeach*[?condition?]{?db name?}{?assign list?}{?text?}
[\not\DTLisgt{\Level}{\Levelgew}]
{cards}{\Level=level,\Title=eng,\Underline=engunderline,\Name=name}
{
\clearpage%start a new page for each row
\thispagestyle{empty}%get rid of the pagenumbers
\begin{tikzpicture}[remember picture,overlay]
\node[yshift=-2.2cm,anchor=south] (icon) at (current page.center) {\includegraphics[height=6cm]{\Name}};
\node[yshift=-3.5cm,text width=8cm,align=flush center] (text) at (current page.center){\huge\bfseries\sffamily\Title\\[15pt]
\LARGE \Underline};
\end{tikzpicture}
}
}
\end{document}
最後,我使用 pgfpackage(\pgfpagesphysicalpageoptions 和 \pgfpageslogicpageoptions)在一張 a4 紙/紙上列印多個卡片/頁面。