From 310e64361530df51f83e26951e9adb281d749a7f Mon Sep 17 00:00:00 2001 From: Sergey Matveev Date: Sat, 11 Nov 2023 20:09:02 +0300 Subject: [PATCH] =?utf8?q?=D0=9F=D0=BE=D0=B2=D1=81=D0=BF=D0=BE=D0=BC=D0=B8?= =?utf8?q?=D0=BD=D0=B0=D0=BB=20LaTeX,=20PGF/TikZ?= MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit Уже не первую неделю почти не программирую, а пишу всякую документацию к своей разработке. Чтобы подготавливать печатный вариант -- такое впервые в моей профессиональной работе. Прежде была только документация в итоге выходившая хотя бы в виде 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. -- 2.48.1