LaTeX 中的调试:带有具体示例的调试演练

LaTeX 中的调试:带有具体示例的调试演练

我对 LaTeX 并不陌生,但我从未真正编写过真正的 LaTeX 脚本,因此我很难调试我手头的脚本。我会发布具体的问题,这样我就可以找到一些可以参考的内容,但我实际上想了解和解决具体问题,并了解通常如何做到这一点。因此问题本身:

我正在使用beamer并尝试使用该包pdfpcnotes来增加命令的功能note(这是 git repo:https://github.com/cebe/pdfpc-latex-notes/blob/master/pdfpcnotes.sty

这是我的妈妈:

\documentclass[]{beamer}
\usepackage{pdfpcnotes}

\begin{document}
\frame{
\frametitle{1. frame}
}
\pnote{first note}

\frame{
\frametitle{2. frame}
}
\pnote{second note}
\end{document}

运行pdflatex该程序将产生以下输出mwe.pdfpc

[notes]
### 1
first note
second note

但实际上应该是

[notes]
### 1
first note
### 2
second note

问题本身将围绕脚本的 if-else 部分。有人可以发布一个关于如何解决此类问题的演练吗?我发现很难理解 LaTeX 的工作原理以及如何从中获取内部信息。

答案1

错误在于

\let\lastframenumber\theframenumber

因为\theframenumber\@arabic\c@framenumber,而不是直接的值。

要查看此内容,请添加\show\theframenumber以下内容begin{document}并从终端进行编译。执行将在此处停止并显示

> \theframenumber=macro:
->\@arabic \c@framenumber .
l.5 \show\theframenumber

? 

按回车键将恢复执行。

解决方案:\edef\lastframenumber{\theframenumber}

完整示例(文档中的包代码):

\documentclass[]{beamer}
%\usepackage{pdfpcnotes}

\makeatletter
% create a new file handle
\newwrite\pdfpcnotesfile

% open file on \begin{document}
\AtBeginDocument{%
  \immediate\openout\pdfpcnotesfile\jobname.pdfpc\relax
  \immediate\write\pdfpcnotesfile{[notes]}%
}
% define a # http://tex.stackexchange.com/a/37757/10327
\begingroup
\catcode`\#=12
\gdef\three@hashchars@space{###\space}%
\endgroup

\def\lastframenumber{0}

% define command \pnote{} that works like note but
% additionally writes notes to file in pdfpc readable format
\newcommand{\pnote}[1]{%
  % keep normal notes working
  \note{#1}%
  % if frame changed - write a new header
  \ifdim\theframenumber pt>\lastframenumber pt
    \edef\lastframenumber{\theframenumber}%
    \immediate\write\pdfpcnotesfile{\three@hashchars@space\theframenumber}%
  \fi
  % write note to file
  \immediate\write\pdfpcnotesfile{\unexpanded{#1}}%
}
% close file on \begin{document}
\AtEndDocument{%
  \immediate\closeout\pdfpcnotesfile
}
\makeatother

\begin{document}
\frame{
\frametitle{1. frame}
}
\pnote{first note}

\frame{
\frametitle{2. frame}
}
\pnote{second note}
\end{document}

输出文件:

[notes]
### 1
first note
### 2
second note

答案2

您的文档应该使用 beamer 进行更好的结构化,但我不知道它是否能解决您的问题

\begin{frame}
\frametitle{}
\pnote{my note}
\end{frame}

由于\pnote其作用类似\note,因此它应该在框架内。

相关内容