Respostas:
Esta resposta é focada no que me interessa, portanto, ela é usada minted
para listagens de código-fonte com a Org e tikzmark
como o pacote que pode "marcar" um local na sua listagem para que você possa consultá-lo posteriormente a partir de uma imagem do Tikz. Aqui está um exemplo simples (ATUALIZADO):
#+LATEX_HEADER: \usepackage{tikz}
#+LATEX_HEADER: \usepackage{minted}
#+LATEX_HEADER: \usetikzlibrary{tikzmark}
#+OPTIONS: toc:nil
* Using minted with tikzmark
# Org mode sample configuration (in your init.el file):
#+BEGIN_SRC emacs-lisp :exports none
(setq org-latex-listings 'minted)
(setq org-latex-minted-options
'(("frame" "lines") ("linenos" "true")))
#+END_SRC
#+ATTR_LATEX: :caption \caption{Yes}\label{lst:code}
#+BEGIN_listing
#+ATTR_LATEX: :options escapeinside=||
#+BEGIN_SRC c
#include <stdio.h>
int main()
{
// comment
printf("hello world\n"); |$\tikzmark{too}$|
return 0;
}
#+END_SRC
#+END_listing
#+BEGIN_LaTeX
\begin{tikzpicture}[overlay,remember picture]
\draw[dashed,->] (pic cs:too) ++(0,0.25) to[bend left]
++(5,-1)node[right]{$\bullet$ Here it is too!};
\end{tikzpicture}
#+END_LaTeX
As you can see in code listing \ref{lst:code}, \ldots
... e este é o resultado (exportado para LaTeX - XeLaTeX no meu caso):
Editei a resposta original para mostrar como colocar marcas fora dos comentários (usando a opção de pigmentos "escapeinside", em vez da opção "mathescape" limitada pela observação da resposta original) e como configurar uma legenda, um rótulo para este ambiente e também como obter uma referência a ele. HTH
2ND UPDATE: Aqui está uma versão do mesmo código (o mesmo de saída), que gerencia a utilização #+CAPTION
, #+LABEL
e [[lst:ref]]
estilos em vez de os de látex, e se livrar do ambiente listando envolvente completamente:
#+LATEX_HEADER: \usepackage{tikz}
#+LATEX_HEADER: \usetikzlibrary{tikzmark}
#+OPTIONS: toc:nil
* Using minted with tikzmark
# Org mode configuration:
#+BEGIN_SRC emacs-lisp :exports none
(setq org-latex-listings 'minted)
(setq org-latex-minted-options
'(("frame" "lines") ("linenos" "true") ("escapeinside" "||")))
#+END_SRC
#+LABEL: lst:code
#+CAPTION: Yes
#+BEGIN_SRC c
#include <stdio.h>
int main()
{
// comment
printf("hello world\n"); |$\tikzmark{too}$|
return 0;
}
#+END_SRC
#+BEGIN_LaTeX
\begin{tikzpicture}[overlay,remember picture]
\draw[dashed,->] (pic cs:too) ++(0,0.25) to[bend left]
++(5,-1)node[right]{$\bullet$ Here it is too!};
\end{tikzpicture}
#+END_LaTeX
As you can see in [[lst:code]], \ldots
Isso não funcionou até que eu me livrei da #+ATTR_LATEX:
linha - não importa onde eu tentasse colocá-la, ela interferia na associação entre legenda / rótulo e o bloco de origem.