2010-04-15 40 views
14

LaTeX中是否有數組?我不是指排版數組的方式。我的意思是數組作爲LaTeX/TeX中的數據結構作爲「編程語言」。我需要將一些vbox-es或hbox-es存儲在一個數組中。它可能就像「一組宏」。LaTeX有一個數組數據結構嗎?

更多細節:我有一個應該排版歌曲的環境。我需要存儲一些歌曲段落作爲參數給我的宏\ songparagraph(所以我不會排版他們,只是存儲這些段落)。由於我不知道在一首特定歌曲中可以放入多少段音樂,因此我需要一個數組。當環境關閉時,所有段落都將被排版 - 但是它們將首先被測量,並且將計算每個段落的最佳位置(例如,可以將一些段落放在兩列中以使歌曲看起來像更緊湊並節省一些空間)。

任何想法都會受到歡迎。 如果你知道LaTeX中的數組,請發佈一個鏈接到一些基本的文檔,教程或只是說明基本命令。

回答

2

退房Arrayjob它實現陣列爲膠乳。無可否認,我只是在偷看它,所以我不知道它會如何有效。但是,如果你不需要自己寫...

9

這是一個數組,如何才能在LaTeX的實現:

\documentclass{article} 
\begin{document} 

\newcounter{mycounter} 
\setcounter{mycounter}{1} 

% ary is any prefix you want, it should not exist as a command. 

\expandafter\newcommand\csname ary\the\value{mycounter} \endcsname{myfirstelement} 
\stepcounter{mycounter} 
\expandafter\newcommand\csname ary\the\value{mycounter} \endcsname{mysecondelement} 

\csname ary1 \endcsname 

or 

\newcounter{index} 
\setcounter{index}{2} 

\csname ary\the\value{index} \endcsname 

\end{document} 

運行此通過乳膠(乳膠mydoc.tex或pdflatex mydoc.tex),你看到的輸出。

一個簡短的解釋:這會創建兩個命令(帶有newcommand):ary1和ary2。需要\expandafter,因爲newcommand不應該定義\csname,而是由\csname ... \endcsname創建的命令。 \expandafter跳過下一個令牌,在此例中爲控制序列\newcommand,並在TeX看到\newcommand之前執行下一個命令。這意味着,TeX所看到的新命令行中的第一件事是\csname ... \endcsname構造,TeX執行它,然後執行\newcommand,結果爲\csname ... \endcsname構造。 \csname foo\endcsname\foo相同,但您可以在由\csname ... \endcsname創建的命令中使用任何字符或空格。

這不是微不足道的。請參閱Victor Eijkhout撰寫的精彩圖書「TeX by topic」:http://eijkhout.net/texbytopic/texbytopic.html

3

要擴展Patrick的答案,簡短答案是「否」。但是,由於它具有宏觀擴展,因此可以編程爲具有數組。

下面是另一個例子,這個使用push和pop代替「數組」。當調用\[email protected]時,它將當前顏色保存到堆棧上。 \[email protected]取頂部顏色定義,並使用它:

\newcount\[email protected] 
\def\[email protected]{% 
    \xglobal\colorlet{foo\the\[email protected]}{.}% 
\global\advance\[email protected] by1\relax} 
\def\[email protected]{% 
    \global\advance\[email protected] by-1\relax% 
\color{foo\the\[email protected]}} 

(I改編自來源爲投影儀包此代碼)

3

你也可以看看datatool包或expl3編程系統和「屬性列表」數據類型。

3

pgfkeys和pgffor也可能適合你。它們是pgf(便攜式圖形格式)包的一部分,但它們可以獨立於所有圖形工具使用。

4

Luatex擁有Lua的表格,它對數組進行了概括。如果標準乳膠對您不重要,請考慮將乳膠與Luatex一起使用。那麼你可以做這樣的事情:

\def\lookup#1{\directlua { 
    local array={1,2,4,8}; tex.print(array[#1])}} 
\[ 2 \mapsto \lookup{2} \] 

LuaTEX等程序是因爲需要逃避各種Lua的字符在乳膠碼有點片狀乳膠。上下文有\startluacode ... \stopluacode宏來處理Lua代碼定義,而\ctxlua用於Lua代碼調用,而我看不出爲什麼不能爲Latex定義類似的東西。