LINUX.ORG.RU

Многократное повторение конструкции в документе

 , ,


1

2

Есть код bash, внутри которого используется

pdflatex -jobname=mydoc$docnumber <<EOF

\documentclass{article}

\begin{document}

% Здесь повторяющаяся конструкция

\end{document}

EOF

Конструкцию нужно повторить n раз, где n будет задано переменной. Однако повторить этот текст нужно не в различных документах, как предполагает pdflatex -jobname=, а в одном. Т.е. задача состоит в том, чтобы многократно напечатать один и тот же текст в одном и том же документе.

Как бы это осуществить?

Deleted

Последнее исправление: Deleted (всего исправлений: 1)

А что, банальный цикл с echo уже не выйдет?

Bfgeshka ★★★★★
()

Тебе что нужно: на баше заполнить циклом, как ниже было сказано, или же цикл забульбенить в документе?

Ну так циклы в документе тоже элементарно делаются. Читай Кнута. А для вставки просто бреда в документ воспользуйся пакетом ipsum

Eddy_Em ☆☆☆☆☆
()
Ответ на: комментарий от Eddy_Em

Читай фиговину. Например, цикл for:

\newcounter{f@rc@unter} 
\newcommand{\forplus}[4][1]{% 
    \setcounter{f@rc@unter}{#2}\ifthenelse{\value{f@rc@unter} < #3}{#4% 
        \addtocounter{f@rc@unter}{#1}% 
        \forplus[#1]{\value{f@rc@unter}}{#3}{#4}}{}} 
\newcommand{\forminus}[4][-1]{% 
    \setcounter{f@rc@unter}{#2}\ifthenelse{\value{f@rc@unter} > #3}{#4% 
        \addtocounter{f@rc@unter}{#1}% 
        \forminus[#1]{\value{f@rc@unter}}{#3}{#4}}{}} 
\def\iterator{\arabic{f@rc@unter}} 
\def\Loop#1#2{\forplus{0}{#1}{#2}} 

Eddy_Em ☆☆☆☆☆
()

Осиль expl3 и твой код в документе станет мягким и шелковистым!

С виду оно, конечно, странно выглядит. Но зато позволяет писать код как на любом другом ЯП: нормальные ветвления, циклы, типы данных, а не та наркомания, которая предоставляется LaTeX2e. Заодно будешь готов к LaTeX3, который всё равно рано или поздно случится.

leonid
()
Ответ на: комментарий от Deleted

Чтобы ускорить компиляцию, повторяющийся кусок можно воткнуть в \savebox, а потом делать \unvbox\copy{box} в каждой итерации цикла.

Eddy_Em ☆☆☆☆☆
()
Ответ на: комментарий от Eddy_Em

Для сравнения дам код на expl3. ИМХО, куда более понятно выглядит:

\documentclass{article}
\usepackage{expl3}

\begin{document}
\ExplSyntaxOn

    \int_new:N \l_count_int
    \int_new:N \l_temp_int
    \int_set:Nn \l_count_int {25}
    
    \int_do_until:nNnn {\l_temp_int} = {\l_count_int}
        {
            \int_incr:N \l_temp_int
            {\par Hello!~LOR:~\int_use:N \l_temp_int}
        }

\ExplSyntaxOff
\end{document}

На выходе документ со строками:

Hello LOR: 1
...
Hello LOR: 25

leonid
()
Ответ на: комментарий от kike

Попробовал, вполне всё получилось. Вот упрощенный вариант:

\usepackage{pgffor}

\begin{document}

\foreach \n in {1,...,5}{
    \n.) ${myarray[$some_var]}\par}
}
\end{document}

Здесь myarray - массив стрингов и вывод будет таким:

1.) Первая строка
2.) Вторая строка
...

Так всё работает и вместо '\n' подставляется число от 1 до 5.

Проблема в том, что мой массив называется не 'myarray', а 'myarray$number', т.е у меня 5 массивов (myarray1, myarray2 итд). И каждая строка - из следующего массива, а не из этого же.

Меня бы вполне устроило, если бы вместо $number подставлялся \n из этого цикла. Но я не могу написать ${myarray\n[$some_var]}.

Может здесь как-то сработал бы eval, но пока непонятно.

Deleted
()
Последнее исправление: Deleted (всего исправлений: 4)
Ответ на: комментарий от leonid

Тоже работает. А сюда можно подставить случайные числа? Так, чтобы в PDF напечаталось 25 строк случайных чисел?

Deleted
()
Последнее исправление: Deleted (всего исправлений: 3)
Ответ на: комментарий от Deleted

Так, чтобы в PDF напечаталось 25 строк случайных чисел?

#!/bin/bash
OUT=output.tex
cat pre.tex > $OUT
for x in $(seq 1 25); do
  echo "$RANDOM\cr" >> $OUT
done
cat post.text >> $OUT
pdflatex $OUT
Eddy_Em ☆☆☆☆☆
()
Ответ на: комментарий от kike

Ты не говорил, что содержимое "повторяющейся конструкции" на деле меняется!

#!/bin/bash
OUT=output.tex
cat > $OUT << EOF
\documentclass[14pt]{extarticle}
\usepackage[koi8-r]{inputenc}
\usepackage[russian]{babel}
\begin{document}
\def\hren{Эдакий абзац, в который натыкана какая-то непонятная хрень, нужная для демонстрации работы
скрипта, а то как же еще иначе? Вот так и выкручиваемся!!!}
\begin{enumerate}
EOF
for N in $(seq 1 10); do
    echo "\item \hren" >> $OUT
done
echo "\end{enumerate}\end{document}" >> $OUT
pdflatex $OUT

Eddy_Em ☆☆☆☆☆
()

Используй для генерации тех файла любой ЯП, который знаешь, нпаример, perl, python, ruby и не парься.

Я использовал ruby - работа со строками, файлами, регулярными выражениями на высоте.

Jurik_Phys ★★★★★
()
Ответ на: комментарий от kike

Так всё равно не работает.

Посколку следствие зашло в тупик, выкладываю файл целиком.

https://gist.github.com/anonymous/6aad703ae8a567db1eb2

Код считывает содержимое файлов category0 - categoryN в разные массивы 'CAT0' - 'CATN'.

Проблем две:
1 - не работает переменная номера массива 'CAT0-N' в foreach
2 - не работает RANDOM, т.е. в каждой строке получается одна и та же случайная строка, а должны быть разные.

В данный момент всё запускается, но берется только одна строка и только из одного массива.

Deleted
()
Последнее исправление: Deleted (всего исправлений: 1)
Ответ на: комментарий от Eddy_Em

Я бы приветствовал такой вариант, если бы мог его заставить работать в моем случае.

Deleted
()
Ответ на: комментарий от Deleted

Ну так в чем проблема?

#!/bin/bash
OUT=output.tex
cat > $OUT << EOF
\documentclass[14pt]{extarticle}
\usepackage[koi8-r]{inputenc}
\usepackage[russian]{babel}
\begin{document}
\begin{enumerate}
EOF
for N in $(seq 1 10); do
    echo "\item " >> $OUT
    cat mydoc_${N} >> $OUT
done
echo "\end{enumerate}\end{document}" >> $OUT
pdflatex $OUT

И все. Будет тебе список, под каждым номером — содержимое файла mydoc_N

Eddy_Em ☆☆☆☆☆
()
Ответ на: комментарий от psv1967

Спасибо, вот это действительно круто ) С латехом уже разобрался.

Deleted
()
Ответ на: комментарий от Deleted

В общем, я не совсем понял, что ты делаешь. Ты хочешь из латекса получить доступ к башевским массивам?! Почему бы самим башем не выплюнуть в файл содержимое массива?

kike
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.