2010-04-15 12 views
14

Có mảng trong LaTeX không? Tôi không có nghĩa là cách để sắp xếp mảng. Tôi có nghĩa là mảng là cấu trúc dữ liệu trong LaTeX/TeX như là một "ngôn ngữ lập trình". Tôi cần lưu trữ một số vbox-es hoặc hbox-es trong một mảng. Nó có thể giống như "một mảng các macro".LaTeX có cấu trúc dữ liệu mảng không?

Chi tiết khác: Tôi có môi trường nên sắp xếp các bài hát. Tôi cần phải lưu trữ một số đoạn của bài hát được đưa ra như là đối số cho vĩ mô của tôi \ songparagraph (vì vậy tôi sẽ không sắp xếp chúng, chỉ cần lưu trữ những đoạn văn). Vì tôi không biết có bao nhiêu đoạn văn có thể trong một bài hát cụ thể, tôi cần một mảng cho điều này. Khi môi trường bị đóng, tất cả các đoạn sẽ được sắp xếp - nhưng chúng sẽ được đo đầu tiên và vị trí tốt nhất cho mỗi đoạn sẽ được tính toán (ví dụ, một số đoạn có thể được đặt sang một bên khác trong hai cột để làm cho bài hát trông nhỏ gọn hơn và tiết kiệm một số không gian).

Mọi ý tưởng đều được hoan nghênh. Xin vui lòng, nếu bạn biết về mảng trong LaTeX, hãy đăng liên kết đến một số tài liệu cơ bản, hướng dẫn hoặc chỉ các lệnh cơ bản của tiểu bang.

Trả lời

2

Check-out Arrayjob mà thực hiện mảng cho LaTeX. Phải thừa nhận rằng, tôi chỉ nhìn vào nó, vì vậy tôi không biết nó sẽ hiệu quả như thế nào. Nhưng, nếu bạn không phải tự viết nó ...

9

Đây là một mảng như thế nào nó có thể được thực hiện trong 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} 

Run này qua LaTeX (mydoc.tex mủ hoặc pdflatex mydoc.tex) và bạn thấy đầu ra.

Giải thích ngắn gọn: điều này tạo hai lệnh (với lệnh mới): ary1 và ary2. Cần \expandafternewcommand không được xác định \csname nhưng lệnh được tạo bởi \csname ... \endcsname. \expandafter nhảy qua mã thông báo tiếp theo, trong trường hợp này là chuỗi điều khiển \newcommand và thực thi lệnh tiếp theo trước khi TeX thấy số \newcommand. Điều đó có nghĩa là, điều đầu tiên trong các dòng mới mà TeX thấy là cấu trúc \csname ... \endcsname, TeX thực thi nó và sau đó thực hiện \newcommand với kết quả của cấu trúc \csname ... \endcsname. \csname foo\endcsname giống với \foo, nhưng bạn có thể sử dụng bất kỳ ký tự hoặc thậm chí không gian nào trong lệnh được tạo bởi \csname ... \endcsname.

Đây không phải là tầm thường. Xem cuốn sách tuyệt vời "TeX theo chủ đề" từ Victor Eijkhout: http://eijkhout.net/texbytopic/texbytopic.html

3

Để mở rộng câu trả lời của Patrick, câu trả lời ngắn gọn là "Không". Tuy nhiên, vì nó có mở rộng macro, nó có thể được lập trình để có các mảng.

Đây là một ví dụ khác, ví dụ này sử dụng tính năng push và pop cho "mảng". Khi \[email protected] được gọi, nó sẽ lưu màu hiện tại vào ngăn xếp. \[email protected] mất định nghĩa màu sắc hàng đầu, và sử dụng nó:

\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]}} 

(Tôi thích mã này từ các nguồn cho các gói máy chiếu)

3

Bạn cũng có thể xem một thứ như gói datatool hoặc hệ thống lập trình expl3 và kiểu dữ liệu "danh sách thuộc tính".

3

pgfkeys và pgffor cũng có thể phù hợp với bạn. Chúng là một phần của gói pgf (định dạng đồ họa di động) nhưng chúng có thể được sử dụng độc lập với tất cả các đồ họa.

4

Luatex có các bảng của Lua, tổng hợp các mảng. Nếu có Latex tiêu chuẩn không quan trọng với bạn, hãy xem xét sử dụng Luatex với Latex. Sau đó bạn có thể làm những việc như:

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

Luatex là một chút flaky với cao su, bởi vì sự cần thiết phải thoát khỏi tất cả các loại nhân vật Lụa trong mã Latex. Bối cảnh có các macro \startluacode ... \stopluacode để xử lý các định nghĩa mã Lua và \ctxlua cho các cuộc gọi mã Lua và tôi không thể thấy bất kỳ lý do nào tại sao những thứ như thế này không thể được xác định cho Latex.