Работая над составлением своих лекционных заметок с помощью LaTeX, я столкнулся с дилеммой:
читабельность и эстетикаПРОТИВ.строгость и полнота
Я обнаруживаю себя, например, работающим над доказательством и сводящим его к нескольким скользким аргументам, но затем понимаю, что у меня могут возникнуть проблемы с его пониманием позже. Не желая жертвовать элегантностью или перегружать себя в будущем огромными кусками пояснительных текстов, я подумал: давайте прокомментируем доказательство. Идея была бы в том, чтобы показывать комментарии, если они нужны, но по умолчанию скрывать их.
Некоторые варианты включают в себяfancytooltips
иpdfcomment
, но их предполагаемые цели отличаются от тех, которые я стремлюсь осуществить.
Что я собираюсь сделать
Что-то вроде этого:
Идея проста: при нажатии клавиши (например S
, но это может быть и пользовательская команда, только желательно не кнопка в самом PDF) на клавиатуре в PDF отображаются некоторые дополнительные элементы (предварительно отрисованные в LaTeX), а когда клавиша S
больше не нажата, они скрываются (опция переключения также может быть интересной). Сложность в том, что это взаимодействие должно иметь возможность:
- Показать/скрыть изображения TikZ (особенно наложения),
- Изменить цвет/выделение/и т.д. обычного текста, отображаемого в документе,
- Быть достаточно эффективным (при просмотре PDF-файла, например, в Acrobat) и не делать исходный код LaTeX совершенно нечитаемым.
Возможные подходы
Теперь я знаю, что существуют пакеты анимации с похожими функциями (например,animate
, видетьэтотвопрос, который я задал для MWE по переключению между картинками TikZ путем нажатия на кнопку).
Другой возможностью может быть непосредственное внедрение кода JavaScript в файл PDF с помощью кода LaTeX (см. замечательный ответ AlexG наэтотвопрос). Это должно быть возможно (надеюсь? см. стр. 651, таблица 8.46PDF-1.7ссылка и стр. 709) и, возможно, это даже лучший способ сделать это с точки зрения эффективности и компактности кода, но должен сказать, что был бы очень благодарен за пару советов о том, как это сделать, поскольку я уже вижу, как трачу часы на устранение неполадок).
Работа с булевыми значениями в LaTeX, вероятно, не слишком хорошо подходит для этой цели, поскольку я подозреваю, что их нельзя просто переключить в отрисованном выводе (или ожидать, что что-то изменится). Но я был бы очень рад, если бы ошибался.
Надеюсь, этот вопрос не слишком обширен; если бы я мог сузить его еще больше, я бы это сделал, но в каком направлении мне двигаться, это, конечно, часть вопроса. В любом случае, большое спасибо за то, что прочитали это или нашли время прокомментировать или ответить, и всего наилучшего!
Ниже приведен минимальный нерабочий пример:
\documentclass[12pt]{report}
\usepackage{tikz}
\usepackage{xcolor}
\newif\ifshowcomments
\begin{document}
\showcommentsfalse
\ifshowcomments
\tikz[overlay]{\draw[green!50!black](0,-.1) -- (1,-.1); \draw[green!50!black,->](.7,-.6) node[xshift=5, yshift=5]{\tiny interesting} -- (.1,-.6) -- (0.1,-.1)}%
\textcolor{green!50!black}{lorem}
\tikz[overlay]{\draw[blue!75!black](0,.4) -- (1,.4); \draw[blue!75!black,->] (0.1,1) node[xshift=12, yshift=-3]{\tiny $math$} -- (0.1,.4)}%
\textcolor{blue!75!black}{ipsum}
\else lorem ipsum \fi
%
\showcommentstrue\hspace{1cm}
%
\ifshowcomments
\tikz[overlay]{\draw[green!50!black](0,-.1) -- (1,-.1); \draw[green!50!black,->](.7,-.6) node[xshift=5, yshift=5]{\tiny interesting} -- (.1,-.6) -- (0.1,-.1)}%
\textcolor{green!50!black}{lorem}
\tikz[overlay]{\draw[blue!75!black](0,.4) -- (1,.4); \draw[blue!75!black,->] (0.1,1) node[xshift=12, yshift=-3]{\tiny $math$} -- (0.1,.4)}%
\textcolor{blue!75!black}{ipsum}
\else lorem ipsum \fi
\end{document}
Выход(обрезано):
решение1
Как насчет использования ocgx
? Вот пример. Для этого требуется Acrobat reader или просмотрщики с эквивалентными возможностями. Если вы скомпилируете это (дважды, потому что так remember picture
работает)
\documentclass{article}
\renewcommand*\familydefault{\sfdefault}
\usepackage[tikz]{ocgx2}
\usetikzlibrary{positioning,tikzmark}
\begin{document}
\tikzmarknode{lorem}{lorem} \tikzmarknode{ipsum}{ipsum} \hfill\switchocg{ocg1}{illuminate}
\begin{ocg}{OCG 2}{ocg1}{0}
\begin{tikzpicture}[overlay,remember picture]
\begin{scope}[green!60!black]
\node at (lorem) {lorem};
\draw ([yshift=-2pt]lorem.south west) coordinate (aux) -- ([yshift=-2pt]lorem.south east)
node[pos=0,below right=1ex,font=\tiny] (int) {interesting};
\draw[-stealth] ([yshift=-1pt]int.south east) -|
([xshift=-1pt]int.west|-aux);
\end{scope}
\begin{scope}[blue]
\node at (ipsum) {ipsum};
\draw ([yshift=2pt]ipsum.north west) coordinate (aux) --
([yshift=2pt]ipsum.north east) node[midway,above=1ex,font=\tiny] (math) {$math$};
\draw[-stealth] ([xshift=-1pt]math.north west) --
([xshift=-1pt]math.west|-aux);
\end{scope}
\end{tikzpicture}
\end{ocg}
\end{document}
Вы получаете
Если вы нажмете на iluminate
, это станет
Если вы нажмете еще раз, вы вернетесь к первому выходу.
Я уверен, что AlexG сможет сделать это более элегантно, но это может быть только началом.
ПРИЛОЖЕНИЕ: Действительно,AlexG может сделать этот путь более элегантным.
\documentclass{article}
\renewcommand*\familydefault{\sfdefault}
\usepackage[tikz]{ocgx2}
\usetikzlibrary{positioning,tikzmark}
\begin{document}
\tikzmarknode{lorem}{lorem} \tikzmarknode{ipsum}{ipsum} \hfill\actionsocg[onmouseall]{}{,,ocg1,}{,,,ocg1}{illuminate}
\begin{ocg}{OCG 2}{ocg1}{0}
\begin{tikzpicture}[overlay,remember picture]
\begin{scope}[green!60!black]
\node at (lorem) {lorem};
\draw ([yshift=-2pt]lorem.south west) coordinate (aux) -- ([yshift=-2pt]lorem.south east)
node[pos=0,below right=1ex,font=\tiny] (int) {interesting};
\draw[-stealth] ([yshift=-1pt]int.south east) -|
([xshift=-1pt]int.west|-aux);
\end{scope}
\begin{scope}[blue]
\node at (ipsum) {ipsum};
\draw ([yshift=2pt]ipsum.north west) coordinate (aux) --
([yshift=2pt]ipsum.north east) node[midway,above=1ex,font=\tiny] (math) {$math$};
\draw[-stealth] ([xshift=-1pt]math.north west) --
([xshift=-1pt]math.west|-aux);
\end{scope}
\end{tikzpicture}
\end{ocg}
\end{document}
Кажется, любопытным кошкам еще многому можно научиться.