هل لدى LATEX بنية بيانات الصفيف؟
سؤال
هل توجد صفائف في اللاتكس؟ لا أقصد الطريق إلى صفائف الأنواع. أعني المصفوفات كهيكل بيانات في LATEX/TEX كـ "لغة برمجة". أحتاج إلى تخزين عدد من Vbox-ES أو Hbox-ES في صفيف. قد يكون شيئًا مثل "مجموعة من وحدات الماكرو".
مزيد من التفاصيل: لدي بيئة يجب أن تكتب الأغاني. أحتاج إلى تخزين فقرات بعض الأغاني المقدمة كوسائط إلى Macro Songparagraph (لذلك لن أقوم بتكوينها ، فقط قم بتخزين تلك الفقرات). بما أنني لا أعرف عدد الفقرات التي يمكن أن تكون في أغنية واحدة ، فأنا بحاجة إلى مجموعة لهذا الغرض. عند إغلاق البيئة ، ستكون جميع الفقرات عبارة عن نوع من النوع - ولكن سيتم قياسها أولاً وسيتم حساب أفضل موضع لكل فقرة (على سبيل المثال ، يمكن وضع بعض الفقرات واحدة أخرى في عمودين لجعل الأغنية تبدو أكثر إحكاما وحفظ بعض المساحة).
كل الأفكار مرحب بها. من فضلك ، إذا كنت تعرف عن المصفوفات في LaTex ، فقم بنشر رابط إلى بعض الوثائق الأساسية أو البرنامج التعليمي أو مجرد أوامر الحالة الأساسية.
المحلول
الدفع Arrayjob الذي ينفذ المصفوفات للملازم. من المسلم به ، لقد نظرت إليه فقط ، لذلك لا أعرف مدى فعالية ذلك. ولكن ، إذا لم يكن عليك أن تكتبها بنفسك ...
نصائح أخرى
هذه مجموعة كيف يمكن تنفيذها في 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}
قم بتشغيل هذا من خلال LATEX (LATEX MYDOC.TEX أو PDFLATEX MYDOC.TEX) وترى الإخراج.
تفسير قصير: هذا ينشئ أمرين (مع NewCommand): ARY1 و ARY2. ال \expandafter
مطلوب لأن newcommand
لا ينبغي تحديد \csname
لكن الأمر الذي تم إنشاؤه بواسطة \csname
... \endcsname
. \expandafter
يقفز على الرمز التالي ، في هذه الحالة تسلسل التحكم \newcommand
وينفذ الأمر التالي قبل أن يرى تكس \newcommand
. هذا يعني أن أول شيء في Newcommand Lines Tex هو \csname
...\endcsname
بناء ، Tex ينفذها ثم ينفذ \newcommand
مع نتيجة \csname
...\endcsname
بناء. \csname foo\endcsname
بالضبط مثل \foo
, ، ولكن يمكنك استخدام أي حرف أو حتى مسافات في الأمر الذي تم إنشاؤه بواسطة \csname
...\endcsname
.
هذا ليس تافها. شاهد الكتاب العظيم "Tex by Topic" من Victor Eijkhout: http://eijkhout.net/texbytopic/texbytopic.html
Lutex لديه طاولات لوا ، والتي تعمم المصفوفات. إذا كان لديك LaTex قياسي ليس مهمًا بالنسبة لك ، ففكر في استخدام Latex مع LaTex. يمكنك بعد ذلك القيام بأشياء مثل:
\def\lookup#1{\directlua {
local array={1,2,4,8}; tex.print(array[#1])}}
\[ 2 \mapsto \lookup{2} \]
Latex هو قشور بعض الشيء مع اللاتكس ، بسبب الحاجة إلى الهروب من جميع أنواع شخصيات لوا في رمز اللاتكس. السياق \startluacode ... \stopluacode
وحدات الماكرو للتعامل مع تعريفات رمز LUA ، و \ctxlua
بالنسبة لمكالمات Lua Code ، ولا يمكنني رؤية أي سبب لعدم تحديد شيء من هذا القبيل لـ LaTeX.
قد تعمل PGFKEYS و PGFFOR أيضًا. انهم جزء من PGF (تنسيق الرسومات المحمولة) ولكن يمكن استخدامها بشكل مستقل عن جميع الأشياء الرسومات.
للتوسع في إجابة باتريك ، الإجابة المختصرة هي "لا". ومع ذلك ، نظرًا لأنه يحتوي على توسع ماكرو ، يمكن برمجته للحصول على المصفوفات.
إليكم مثال آخر ، هذا مثال يستخدم Push and Pop لـ "المصفوفات". متى \type@pushcolour
يسمى ، أنه يحفظ اللون الحالي على المكدس. \type@popcolour
يأخذ تعريف اللون العلوي ، ويستخدمه:
\newcount\type@count
\def\type@pushcolour{%
\xglobal\colorlet{foo\the\type@count}{.}%
\global\advance\type@count by1\relax}
\def\type@popcolour{%
\global\advance\type@count by-1\relax%
\color{foo\the\type@count}}
(لقد قمت بتكييف هذا الرمز من مصدر حزمة Beamer)
يمكنك أيضًا النظر إلى شيء مثل حزمة Datatool أو نظام برمجة Expl3 ، ونوع بيانات "قائمة الخصائص".
ال ReadArray تتيح الحزمة أن يقوم أحد بإدخال بيانات منسقة في عناصر من صفيف ثنائي الأبعاد أو ثلاثي الأبعاد (أو صفيف سجل ملف 1-D).
\documentclass{standalone}
\usepackage{readarray}
\def\data{% the data
1 15 14 4
10 11 8 5
7 6 9 12
16 2 3 13
}
\readarray\data\dataA[4,4] %read the data to \dataA
\begin{document}
value at (2,1) = \dataA[2,1] %access a specific field
\end{document}