Прикосновение к LATEX
Feb. 6th, 2024 12:16 pmК своей статье Калькуляторы с обратной польской нотацией мне хотелось сделать красивую иллюстрацию с графиками аппроксимирующего полинома синуса. При этом мне было мало одного gnuplot, так как в подписи осей мне хотелось добавить живую формулу.

Попутно мне нужна была красивая таблица расчёта тригонометрических функций и их десятичные значения. Такую таблицу тоже пришлось делать самому.

Чтобы это реализовать мне пришлось разобраться с Latex. Много раз пытался освоить эту систему вёрстки, и постоянно не хватало мотивации. Как я понял, лучший способ что-то освоить - это иметь конкретную задачу и в рамках неё уже производить освоение.
В общем рассказываю о своём вливании в тему.
1. График синуса и аппроксимирующего полинома
Первое с чего я начал - это с графика синуса. Мне нужно было, чтобы в легендах была формула того, что отображается. И начал я с того что начал искать готовый пример. И нашел его тут. Смысл в том, что часть функционала брал на себя gnuplot, который генерировал tex-файл, который компилировался уже pdflatex

Там достаточно много символов в строке Makefile. Самое сложное было это установить корректно LATEX и заставить его работать. Это прям отдельный квест, я гуглил каждую ошибку и доустанавливал недостающие пакеты. Это единственная программа с которой у меня было столько проблем и танцев с бубном, чтобы просто заставить её работать. Сейчас уже не вспомню всех телодвижений, но даже повторить этот make у меня ушло часа два гуглежа. Сейчас попробовал на другой системе, и второй раз этот путь пройти не готов. Но приведу пример файла test.plt, который содержал график.
Но мне показалось, что как-то муторно иметь два файла, и фактически всё равно вызывается LATEX. Плюс, мне хотелось получить точки -π/2 и π/2, что показать место где полином расходится с синусом и показать подписи на графике функций. Поэтому я решил немного почитать матчасть "Набор и вёрстка в системе
LATEX" и сделал следующий скрипт.
И всё успешно получилось.
2. Таблица
С таблицей синусов всё было проще и сложнее одновременно. Таблицу синусов я нашёл сразу готовой. Надо было только в начале и в конце добавить:
И получился такой вот чудесный результат.

Как можно видеть, что таблица готовая. Но сложности начались тогда, когда мне захотелось изменить размеры ячеек по высоте, ширине и выравнивание в ячейке. Чтение мануалов мне мало помогло, а погружаться в глубины латеха мне не хотелось. Поэтому решил, что и так сойдёт, и вышел у меня такой вот скрипт.
В общем, вёрстка LATEX у меня вызвала противоречивые чувства. После подхода linux, что всё скриптовое - это намного более удобного того же MS Word. Но, куча проблем с совместимостями, непонимание что же происходит, отсутствие мгновенного просмотра результата сильно ограничивают применение инструмента. Но мне понравилось, что можно делать крутые научные статьи, крутую вёрстку, прям как в даташитных пдфках.

Попутно мне нужна была красивая таблица расчёта тригонометрических функций и их десятичные значения. Такую таблицу тоже пришлось делать самому.

Чтобы это реализовать мне пришлось разобраться с Latex. Много раз пытался освоить эту систему вёрстки, и постоянно не хватало мотивации. Как я понял, лучший способ что-то освоить - это иметь конкретную задачу и в рамках неё уже производить освоение.
В общем рассказываю о своём вливании в тему.
1. График синуса и аппроксимирующего полинома
Первое с чего я начал - это с графика синуса. Мне нужно было, чтобы в легендах была формула того, что отображается. И начал я с того что начал искать готовый пример. И нашел его тут. Смысл в том, что часть функционала брал на себя gnuplot, который генерировал tex-файл, который компилировался уже pdflatex

Там достаточно много символов в строке Makefile. Самое сложное было это установить корректно LATEX и заставить его работать. Это прям отдельный квест, я гуглил каждую ошибку и доустанавливал недостающие пакеты. Это единственная программа с которой у меня было столько проблем и танцев с бубном, чтобы просто заставить её работать. Сейчас уже не вспомню всех телодвижений, но даже повторить этот make у меня ушло часа два гуглежа. Сейчас попробовал на другой системе, и второй раз этот путь пройти не готов. Но приведу пример файла test.plt, который содержал график.
set grid
set yrange [-5:5]
set xrange [-3*pi:3*pi]
plot sin(x) title "$\\sin(x)$", \
x * ( 1 + x**2 * (0.00761 * x**2 - 0.16605)) title "$sin(x) = x \\cdot (1+x^{2}\\cdot(0,00761\\cdot x^{2}-0,16605))$"
Но мне показалось, что как-то муторно иметь два файла, и фактически всё равно вызывается LATEX. Плюс, мне хотелось получить точки -π/2 и π/2, что показать место где полином расходится с синусом и показать подписи на графике функций. Поэтому я решил немного почитать матчасть "Набор и вёрстка в системе
LATEX" и сделал следующий скрипт.
\documentclass[8pt,a4paper,dvipsnames]{article}
\usepackage[utf8]{inputenc}
\usepackage[left=2cm,right=2cm,top=1.5cm,bottom=1.5cm]{geometry}
\usepackage{graphicx,gnuplottex,amsmath}
\usepackage{xcolor}
\begin{document}
\begin{figure}[htp]
\centering
\begin{gnuplot}[scale=1.3, terminal=epslatex, terminaloptions=color dashed]
set grid
set yrange [-5:5]
set xrange [-3*pi:3*pi]
set xtics ("-2$\\pi$" -2*pi, "-$\\pi$" -pi, "-$\\dfrac{\\pi}{2}$" -pi/2, 0, "$\\dfrac{\\pi}{2}$" pi/2,"$\\pi$" pi, "2$\\pi$" 2*pi)
plot sin(x) title "$\\sin(x)$", \
x * ( 1 + x**2 * (0.00761 * x**2 - 0.16605)) title "$sin(x) = x \\cdot (1+x^{2}\\cdot(0,00761\\cdot x^{2}-0,16605))$"
\end{gnuplot}
\end{figure}
\end{document}
И всё успешно получилось.
2. Таблица
С таблицей синусов всё было проще и сложнее одновременно. Таблицу синусов я нашёл сразу готовой. Надо было только в начале и в конце добавить:
% Automatically added code
\documentclass{article}
\usepackage{amsmath}
...
\end{document}
% End of automatically added code
И получился такой вот чудесный результат.

Как можно видеть, что таблица готовая. Но сложности начались тогда, когда мне захотелось изменить размеры ячеек по высоте, ширине и выравнивание в ячейке. Чтение мануалов мне мало помогло, а погружаться в глубины латеха мне не хотелось. Поэтому решил, что и так сойдёт, и вышел у меня такой вот скрипт.
% Automatically added code
\documentclass{article}
\usepackage{amsmath}
\begin{document}
% End of automatically added code
\subsubsection*{Values of sine functions for common angles.}
%\begin{tabular*}{\linewidth}[b]{*{6}{|c @{\extracolsep\fill}}|}
\begin{tabular*}{\linewidth}[b]{*{6}{|c @{\extracolsep\fill}}|}
\hline Angle in Degrees &0$^\circ$& 30$^\circ$ & 45$^\circ$ & 60$^\circ$ & 90$^\circ$\\
\hline Angle in Radians &0$^c$ & $\dfrac{\pi}{6}$& $\dfrac{\pi}{4}$ & $\dfrac{\pi}{3}$ & $\dfrac{\pi}{2}$\\
\hline $\sin \theta$ & 0 & $\dfrac{1}{2}$ &$\dfrac{1}{\sqrt{2}}$ & $\dfrac{\sqrt{3}}{2}$& 1\\[15pt]
\hline $\sin \theta$, Calculated values & 0 & 0,5 & 0,7071.. & 0,8660.. & 1\\
\hline
\end{tabular*}
% Automatically added code
\end{document}
% End of automatically added code
В общем, вёрстка LATEX у меня вызвала противоречивые чувства. После подхода linux, что всё скриптовое - это намного более удобного того же MS Word. Но, куча проблем с совместимостями, непонимание что же происходит, отсутствие мгновенного просмотра результата сильно ограничивают применение инструмента. Но мне понравилось, что можно делать крутые научные статьи, крутую вёрстку, прям как в даташитных пдфках.
no subject
Date: 2024-02-06 11:27 am (UTC)Даже VSCode умеет на лету рендерить PDF в половине окна.
no subject
Date: 2024-02-06 12:51 pm (UTC)Плагин?
no subject
Date: 2024-02-06 01:02 pm (UTC)Ну там все плагины же...
Называется LaTeX Workshop (https://github.com/James-Yu/LaTeX-Workshop), он его сам можно сказать предлагает, когда открываешь *.tex файл.
Еще есть TeX Studio, классный редактор. Но не помню, автоматом он рендерит или нет, но в любом случае там наверху просто жмешь «Плей» и получаешь в окне просмотра PDF.
Причем долго (ну секунд 10) рендерится только первый раз, когда с нуля, потом обновления рендерятся только в месте обновления.
no subject
Date: 2024-02-06 02:04 pm (UTC)>отдельный квест, я гуглил каждую ошибку и доустанавливал недостающие пакеты. Это единственная программа с которой у меня было столько проблем и танцев с бубном
вот да, есть такое.
>отсутствие мгновенного просмотра
была какая-то оболочка. не помню название, но лет 10 назад активно пользовался. слева ТеХ текст, справа превью.
ps: и про точность полинома в диапазоне +-Pi/2. имхо, тут лучше выражать точность в процентах или долях максимального отклонения. имхо, тут интереснее именно максимальный а не усредненный факап.
no subject
Date: 2024-02-06 02:16 pm (UTC)>>ТеХ — он странный. он вроде бы и пакетно-скриптовый, но при обработке кривого ввода на каждый чих задает вопрос, вместо того чтоб сразу итого нагадить в стдерр. просто странный, чуть не та идеология применения.
Вот, это бесячья тема.
>>ps: и про точность полинома в диапазоне +-Pi/2. имхо, тут лучше выражать точность в процентах или долях максимального отклонения. имхо, тут интереснее именно максимальный а не усредненный факап.
В данном случае я посчитал вообще сумму ошибки, даже не максимальное и не среднее. И она получилась столь малой, что тема рабочая оказывается :)
no subject
Date: 2024-02-06 02:42 pm (UTC)ага. по этим граблям лет 10 назад ходил. реально бесит. подозреваю, что это наследие эпохи перфокарт и сопутствующих обычаев "отладки".
>>про точность
>посчитал вообще сумму ошибки
ну а хз. обычно интереснее какое-то среднее, а лучше максимальное отклонение. но из интеграла отклонения можно быстро оценить среднее отклонение. тоже интересно, но тут "на вкус и на цвет"
>она получилась столь малой, что
ага! бывает иногда такая приятная неожиданность. по идее, там тупо разложение синуса в фурье, но чуть иначе записано.
no subject
Date: 2024-02-06 02:44 pm (UTC)>>ага! бывает иногда такая приятная неожиданность. по идее, там тупо разложение синуса в фурье, но чуть иначе записано.
Да не, просто полином, найденный МНК.
no subject
Date: 2024-02-06 03:02 pm (UTC)и хз тут МНК или тэйлор. по идее, итог будет примерно одинаков.
no subject
Date: 2024-02-06 03:04 pm (UTC)Несколько раз в жизни делал документы в LaTeX. Моё мнение: во многих местах он сильно устарел. Поддержка unicode, современных шрифтов, не существует, или требует знания шизотерических технологий 60-х годов прошлого века.
Существуют сборки, в которых все эти проблемы якобы решены из коробки, но если они вдруг не работают (а такое бывает!), то фиг разберёшься, что именно в нем не работает, и как починить.
В сети тысячи противоречащих друг-другу советов, как набирать текст на русском, как использовать unicode, как подключать современные шрифты.
Большинство из этих советов не работают. Они привязаны к каким-то конкретным путям и прочим идиосинкратическим реалиям софта середины 20-го века.
Да, тогда это был шедевр, но сейчас любая попытка работы с ним вызывает боль.
Собираюсь попробовать проект на основе LaTeX, который обещает часть этой боли купировать:
https://github.com/tectonic-typesetting/tectonic (https://github.com/tectonic-typesetting/tectonic)
no subject
Date: 2024-02-06 09:05 pm (UTC)no subject
Date: 2024-02-06 09:08 pm (UTC)Он просто слишком мощный. И для того, чтобы сверстать одну табличку или сгенерировать подписи в гнуплоте, вся свистопляска наглухо не нужна. Кстати, рекомендую рисовать картинки не в гнуплоте, а в питоне с матплотлибом. Заодно мейкфайлы не понадобятся.
no subject
Date: 2024-02-06 09:52 pm (UTC)% Automatically added code
\documentclass{article}
\usepackage{amsmath}
\renewcommand{\arraystretch}{2.2}
\begin{document}
\subsubsection*{Values of sine functions for common angles.}
\begin{tabular}{|l|c|c|c|c|c|}
\hline Angle in Degrees &$0^\circ$& $30^\circ$ & $45^\circ$ & $60^\circ$ & $90^\circ$\\
\hline Angle in Radians &$0^c$ & $\dfrac{\pi}{6}$& $\dfrac{\pi}{4}$ & $\dfrac{\pi}{3}$ & $\dfrac{\pi}{2}$\\[5pt]
\hline $\sin \theta$ & 0 & $\dfrac{1}{2}$ &$\dfrac{1}{\sqrt{2}}$ & $\dfrac{\sqrt{3}}{2}$& $1$\\[5pt]
\hline $\sin \theta$, Calculated values & $0$ & $0.5$ & $0.7071..$ & $0.8660..$ & 1\\
\hline
\end{tabular}
\end{document}
no subject
Date: 2024-02-06 10:37 pm (UTC)no subject
Date: 2024-02-06 10:39 pm (UTC)Я ниже привел пример отказа от makefile и делаю в одном tex скрипте.
no subject
Date: 2024-02-07 07:53 am (UTC)Я просто немного погуглил.
\renewcommand{\arraystretch}{2.2} — добавляет отступ вверху строки
[5pt] — добавляет отступ внизу строки
\begin{tabular}{|l|c|c|c|c|c|} — выравнивание по столбцам
no subject
Date: 2024-02-07 08:08 am (UTC)Спасибо большое!
no subject
Date: 2024-02-07 02:00 pm (UTC)Не хочу — принципиально стараюсь избегать любые облачные сервисы. Сегодня они работают, завтра — нет, или блокируют тебя по национальному/политическому признаку.
Я несколько раз в жизни писал документы в latex. Даже книгу один раз сверстал (жаль, потом потерял исходники).
Когда он работает — он прекрасен. Но шаг влево, шаг вправо — всё ломается с совершенно абстрактными текстами ошибок, по которым невозможно понять ничего. Ещё хуже, когда документ компилируется без ошибок, но русских букв в нём нет. И куда копать — непонятно.
Да, чудес не бывает, во всём можно разобраться. Вот только Latex cам по себе сложная система, его работа со шрифтами — это тоже вещь в себе, у меня нет времени тратить недели на глубокое изучение его внутреннего устройства.
Из коробки он чаще не работает, чем работает. Несколько раз ставил эксперименты: ставлю готовую ванильную сборку, типа какого-нибудь Xetex, которая заявляет, что в ней из коробки побеждены все проблемы с Unicode и современными шрифтами. Компилирую простой документ из одного предложения на русском языке. Либо всё рушится на этапе компиляции, с невнятными ошибками. Либо получаем документ с квадратиками на месте русских букв.
В 2024 году это выглядит так, что пора уже выбросить на помойку и заменить каким-нибудь более современным софтом. В котором, во-первых будут понятные сообщения об ошибках, не требующие глубоких детальных знаний всей экосистемы Latex. Чтобы просто говорилось: "По пути /foo/bar/baz не найден шрифт Hacker Nerd Mono.otf", а не какая-то абстрактная нечитаемая абракадабра, выводимая latex'ом. Во-вторых, который будет использовать современные стандарты для кодировок (типа, Unicode по умолчанию из коробки а не пришитый кое-как в систему, которая изначально плохо поддерживала многоязычность — якобы задумка TeXа была в поддержке многоязычности, но на самом деле, по ощущениям, с этим всегда было туго), шрифтов, путей, кэшей, временных файлов, и всего остального.
no subject
Date: 2024-02-07 02:33 pm (UTC)Сколько боли :). Но я понимаю причину.
На самом деле, система скриптовой вёрстки — очеь крутая, но реализация тупо устарела.
no subject
Date: 2024-02-07 03:04 pm (UTC)Вокруг нуля это Маклорен ;)
no subject
Date: 2024-02-08 02:03 pm (UTC)Верстал книжку по вероятности/статистике; ну что — получилось... но там многое в вёрстке было отражением хотелок заказчика и его и моего преставлений о прекрасном. Получилось всё, каких-то технических проблем не помню (ещё бы, на фоне такого количества работы); делал ещё Makefile для сборки из нескольких частей, как целиком, так и по частям.