在使用 LaTeX 整理我的讲义时,我遇到了一个难题:
可读性和美观性对阵。严谨性和全面性
例如,我发现自己在研究一个证明,并将其归结为几个巧妙的论证,但后来意识到我以后可能会遇到困难。我不想牺牲优雅,也不想让未来的自己被大量的解释性文字淹没,所以我想,让我们对证明进行评论。这个想法是,如果需要的话,显示评论,但默认情况下,它们被隐藏。
一些选项包括fancytooltips
和pdfcomment
,但它们的预期目的与我的目标不同。
我的目标是
像这样:
这个想法很简单,当按下S
键盘上的某个键(例如,但也可能是自定义命令,但最好不是 PDF 本身的按钮)时,PDF 中会显示一些附加元素(在 LaTeX 中预渲染),一旦S
不再按下该键,它们就会隐藏(切换选项可能也很有趣)。困难在于这种交互必须能够:
- 显示/隐藏 TikZ 图片(尤其是覆盖图),
- 更改文档中显示的常规文本的颜色/突出显示/等,
- 合理高效(例如在 Acrobat 中查看 PDF 时)并且不会使 LaTeX 源代码完全无法读取。
可能的方法
现在,我知道有具有类似功能的动画包(例如animate
, 看这问题我曾向 MWE 询问如何通过单击按钮在 TikZ 图片之间切换)。
另一种可能性是直接通过 LaTeX 代码将 JavaScript 代码嵌入到 PDF 文件中(请参阅 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 阅读器,或具有同等功能的查看器。如果你编译这个(两次,因为这是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}
看来好奇的猫还可以学到很多东西。