[О блоге] [наверх] [пред] [2023-11-11 20:09:02+03:00] [310e64361530df51f83e26951e9adb281d749a7f]

Повспоминал LaTeX, PGF/TikZ

Уже не первую неделю почти не программирую, а пишу всякую документацию к
своей разработке. Чтобы подготавливать печатный вариант -- такое впервые
в моей профессиональной работе. Прежде была только документация в итоге
выходившая хотя бы в виде HTML. На самом деле мне не говорили что нужен
печатный вариант, но если надо навставлять математических выражений, тем
более что-то порисовать, то первое в HTML геморрой, а второе в любом
случае я буду делать какими-то TeX-specific средствами.

Я никогда в жизни не рисовал схемки "от руки", разве что только в ASCII.
ec09a3609c081a53cc97bceecf2a1e98b80da667 b6c8b1922c3ac35ed0138b608115dc7c63e2cece
Только чётко детерминированные и явно расположенные друг относительно
друга элементы в TikZ. Но чтобы взять в руку мышку/трэкболл, расставлять
кружочки/квадратики и между ними указывать стрелочки? На за что!

Вообще LaTeX я время от времени брал в руки, но чтобы какой-нибудь отчёт
для секретариата сдать, просто копируя по шаблону кучу элементов. Не
могу сказать что я освежал знания о нём при этом. А сейчас я пересел на
XeLaTeX (993356e6db7459241dbd8c8312ea69bbb49045f7), с которым все мне
нужные и попадающиеся пакеты совместимы. Недостаток в нём правда есть:
hyperref не показывает какие именно ссылки не определены. Поэтому руками
время от времени запускаю pdfLaTeX только для получения этих ошибок.

Многое упростилось, стало надо меньше костылей. Начал обмазывать текст,
даже в мат-формулах ссылками внутренними для документа. По сути он
становится, как и HTML -- гипертекстовым, куда ни тыкни. Упоминается
HKDF? Тыкаешь: попадаешь на его определение. Какой-то K_{foo} ключ?
Тыкаешь и попадаешь на его определение.

Texinfo меня приучил стараться всё обмазывать ещё и индексами. В итоге
предметный указатель, как и в хорошем Texinfo документе, становится
очень удобен даже для меня, автора документа. Хотя это и превращается в
портянку copy-paste: \index{Foo} \hypertarget{Foo}{} \subsection{Foo}

Очень стараюсь соблюдать корректный вид шрифта/текста: если в тексте
используется название ключа/хэша/whatever, то его вид (курсив ли,
моноширинный ли) должен везде, включая формулы, оставаться стабильным. А
учитывая, что нужно ещё и ссылки делать, то вместо изначально предельно
простых записей становится месиво типа \hyperlink{Foo}{\texttt{Foo}}\Big(\big(

PlantUML оказывается умеет делать вывод в виде TikZ кода, пригодного для
\input-а в TeX. Но... как-то всё не так у него при этом с размерами. Или
буквы нормальные, но сама схема не влезает. Или схема влезает, но буквы
слишком маленькие. Для компактных схем ещё более менее, но у меня таких
почти нет. В итоге продолжаю делать вывод в Encapsulated PostScript.
GraphViz аналогично в EPS умеет. Ни в одном месте не будет растра,
только вектор!

Документация для TikZ у меня таскается в ~/doc/man/tex/ директории уйму
лет. Скачал тут обновлённую версию, которая на 1300+ страниц. Прежде
было раза в 2-2.5 меньше вроде бы. Ещё не смог прочувствовать насколько
ли в нём стало чего удобнее и мощнее -- пока хватало прежних запасов
умений.

Всё это переведено на redo конечно же:
    % cat default.pdf.do
    for i in *.plantuml ; do deps="$i.eps $deps" ; done
    [...]
    redo-ifchange $2.tex $deps
    exec >&2
    tmp=`mktemp -d`
    trap "rm -fr $tmp" HUP PIPE INT QUIT TERM EXIT
    prevAuxHash="dummy"
    while [ "$auxHash" != "$prevAuxHash" ]; do
        prevAuxHash=$auxHash
        xelatex -halt-on-error -output-directory=$tmp $2.tex
        ( cd $tmp ; makeindex $2.idx )
        auxHash=`b3sum < $tmp/$2.aux`
    done
    mv $tmp/$2.pdf $3

Есть таблички, где надо высчитывать "итого"/сумму столбцов. Ну не делать
же мне это руками? Но я потратил дофигище времени чтобы как-то красиво
решить эту проблему. Изначально я хотел чтобы сам TeX это посчитал. Даже
есть пакеты позволяющие вычислить сумму из столбцов, но какие-то они не
гибкие, сложные и шаг-в-сторону-расстрел. Просто эстетически не
понравилось. Есть pgfplotstable, который безумно мощен, крут, в нём даже
можно добавить столбец с суммой, а данные брать из полу-сырого внешнего
файла. Но мне нужен не столбец, а строка. Где-то в Интернете увидел
решение в виде: транспонировать таблицу, добавить столбец,
транспонировать назад. И всё это с экраном TeX кода который я не понимаю
(я в общем-то чисто начинающий user во всём этом *TeX мире). Хорошо,
подумал я: не надо хотеть странного -- в TeX можно импортировать данные,
а вот считать их уже как-то автоматизированно. В файлике с данными есть
сырые данные, и надо как в Excel добавить строчку с суммой. Вариант с
настоящими табличными процессорами (4b4b3dd84fd22ad74d5dbbf90a7024eca665882f,
8b9b7c565c8c1b25f042bbe6b266901819fd5398) слишком монструозен, плюс
появился бы не человекочитаемый формат таблицы. В общем, я считаю что
закончилось это у меня вот таким обсёром:

    % cat default.sum.tex.do
    #!/usr/bin/env perl

    use strict;
    use warnings;

    system "redo-ifchange $ARGV[1].sum";
    open(my $fd, "< $ARGV[1].sum") or die $!;
    my @sums;
    while (<$fd>) {
        print "$_\\\\\n";
        my @cols = split "&";
        for (my $i=0; $i <= $#cols; $i++) {
            my $v = $cols[$i];
            $v =~ s/\s//g;
            next unless $v =~ /^\d+$/;
            $sums[$i] += $v;
        };
    };

    print join " & ", map { (defined $_) ? $_ : "" } @sums;
    print "\\\\\n";

Буквально программкой которая для всех столбцов (где есть только числа)
считает их сумму. Я же этого хотел? И результат то в общем-то вполне
себе: .sum файл содержит буквально TeX код, который даже приятно
выглядит из-за выравнивания (2b5c80afecf0eb12fe394918a17f3ecedbc18779),
и для него добавляется строчка с суммой. И достаточно сделать \input
этого файла, учесть его в зависимостях к документу и redo его
автоматически посчитает, если он изменился.

Но вообще всё это, даже месиво TeX конструкций, мне всё-равно продолжает
нравится и доставлять удовольствие. И нравится что документ вовсю
гипертекстовый. А если распечатать, то хотя бы предметный указатель
автоматически сгенерированный удобно имеется. А если PDF-ку прогонять
(5c2b1203284c41e99a6af455ce9257821d95dd3d) через Ghostscript, exiftool
(для метаинформации) и QPDF, то и размер во много раз у меня сокращается
при этом, хотя вырезания шрифтов не происходит, должен быть PDF/A.

    [оставить комментарий]