Enquanto trabalhava na curadoria de minhas notas de aula com LaTeX, me deparei com um dilema:
legibilidade e estéticaVS.rigor e abrangência
Encontro-me, por exemplo, trabalhando em uma prova e resumindo-a a alguns argumentos engenhosos, mas depois reconheço que posso ter dificuldade em segui-la mais tarde. Não querendo sacrificar a elegância ou sobrecarregar meu futuro com enormes pedaços de textos explicativos, pensei, vamos comentar a prova. A ideia seria mostrar comentários se fossem necessários, mas, por padrão, ocultá-los.
Algumas opções incluemfancytooltips
epdfcomment
, mas os objetivos pretendidos diferem do que pretendo fazer.
O que pretendo fazer
Algo assim:
A ideia é simplesmente que, ao pressionar uma tecla (por exemplo S
, mas pode muito bem ser um comando personalizado, mas de preferência não um botão no próprio PDF) no teclado, alguns elementos adicionais (pré-renderizados em LaTeX) aparecem no PDF e, quando a S
tecla não for mais pressionada, eles serão ocultados (uma opção de alternância também pode ser interessante). A dificuldade é que essa interação teria que ser capaz de:
- Mostrar/ocultar imagens TikZ (especialmente sobreposições),
- Altere a cor/destaque/etc. do texto normal mostrado no documento,
- Seja razoavelmente eficiente (ao visualizar o PDF, por exemplo, no Acrobat) e não torne o código-fonte do LaTeX completamente ilegível.
Abordagens possíveis
Agora, eu sei que existem pacotes de animação com funcionalidades semelhantes (por exemploanimate
, veressepergunta, solicitei um MWE sobre como alternar entre imagens TikZ clicando em um botão).
Outra possibilidade pode ser incorporar diretamente o código JavaScript no arquivo PDF via código LaTeX (veja a maravilhosa resposta de AlexG paraessepergunta). Isso deveria ser possível (espero? Ver p. 651 tabela 8.46 doPDF-1.7referência e pág. 709), e pode até ser a melhor maneira de fazer isso em termos de eficiência e código compacto, mas devo dizer que ficaria muito grato por algumas dicas sobre como fazer isso, já que já consigo me imaginar gastando horas solução de problemas final).
Trabalhar com booleanos no LaTeX provavelmente não atende muito bem a esse propósito, pois suspeito que não se pode simplesmente alterná-los na saída renderizada (ou então esperar que algo mude). Mas ficaria muito feliz se estivesse enganado.
Espero que esta questão não seja muito ampla; se eu pudesse restringir ainda mais, eu o faria, mas a direção que devo seguir é, na verdade, parte da questão. De qualquer forma, muito obrigado por ler isto ou por reservar um tempo para comentar ou responder, e tudo de bom!
Abaixo está um exemplo mínimo que não funciona:
\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}
Saída(cortado):
Responder1
Que tal usar ocgx
? Aqui está um exemplo. Requer leitor Acrobat ou visualizadores com capacidades equivalentes. Se você compilar isso (duas vezes, porque é assim que remember picture
funciona)
\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}
você consegue
Se você clicar em iluminate
, isso se tornará
Se você clicar novamente, estará de volta à primeira saída.
Tenho certeza de que AlexG pode tornar isso mais elegante, mas pode ser um começo.
TERMO ADITIVO: De fato,AlexG pode tornar este caminho mais elegante.
\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}
Parece que há muitas coisas que os gatos curiosos ainda podem aprender.