Ключевой прослушиватель для отображения/скрытия комментариев TikZ и выделения текста в выходных данных PDF

Ключевой прослушиватель для отображения/скрытия комментариев TikZ и выделения текста в выходных данных PDF

Работая над составлением своих лекционных заметок с помощью LaTeX, я столкнулся с дилеммой:

            читабельность и эстетикаПРОТИВ.строгость и полнота

Я обнаруживаю себя, например, работающим над доказательством и сводящим его к нескольким скользким аргументам, но затем понимаю, что у меня могут возникнуть проблемы с его пониманием позже. Не желая жертвовать элегантностью или перегружать себя в будущем огромными кусками пояснительных текстов, я подумал: давайте прокомментируем доказательство. Идея была бы в том, чтобы показывать комментарии, если они нужны, но по умолчанию скрывать их.

Некоторые варианты включают в себяfancytooltipsиpdfcomment, но их предполагаемые цели отличаются от тех, которые я стремлюсь осуществить.

Что я собираюсь сделать

Что-то вроде этого:

                     наглядный пример

Идея проста: при нажатии клавиши (например S, но это может быть и пользовательская команда, только желательно не кнопка в самом PDF) на клавиатуре в PDF отображаются некоторые дополнительные элементы (предварительно отрисованные в LaTeX), а когда клавиша Sбольше не нажата, они скрываются (опция переключения также может быть интересной). Сложность в том, что это взаимодействие должно иметь возможность:

  1. Показать/скрыть изображения TikZ (особенно наложения),
  2. Изменить цвет/выделение/и т.д. обычного текста, отображаемого в документе,
  3. Быть достаточно эффективным (при просмотре 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}

Кажется, любопытным кошкам еще многому можно научиться.

Связанный контент