在草稿源文档位置进行标记/跟踪

在草稿源文档位置进行标记/跟踪

我肯定是在这里重新发明轮子了。

我正在编写一个相当长的文档,其中每个部分都对应其自己的输入文件。基本上,我有一个类似于以下内容的母文档:

%% Fellowship of the Ring
\input{preamble}
\begin{document}
\input{content/chap_01/opening}
\input{content/chap_01/announcement}
\input{content/chap_01/so_far_no_trouble}
\input{content/chap_01/twelve_more_years}
....
\input{content/chap_02/gossip_about_bilbo}
\input{content/chap_02/gossip_about_world}
....

写了一段时间后,我不再记得所有文件名的含义。当我在草稿中发现错误时,要确定哪个文件包含令人反感的文字真是件很麻烦的事。

不久前,我编写了一些代码,可以设置一个标志,表明我正在写草稿,并在最终文档中打印源文件(包括目录路径)。这段代码真是一个可怕的黑客行为,我滥用了\@startsection

以下是 MWE:

\documentclass{article}
%%--------------------------------------------------------------------------------
\usepackage{xcolor}
\usepackage{currfile}
\usepackage{fancyvrb}
\usepackage{xparse}
\makeatletter
\ExplSyntaxOn
%% booleans for flaggging ROUGH DRAFT status
\bool_new:N \ae_roughdraft_bool
\bool_gset_false:N \ae_roughdraft_bool
\NewDocumentCommand \setroughdraft   {} { \bool_gset_true:N  \ae_roughdraft_bool }
\NewDocumentCommand \unsetroughdraft {} { \bool_gset_false:N \ae_roughdraft_bool }
%% 
\cs_new:Npn \fnc_ae_currentfile:n #1 {
    \bool_if:NT \ae_roughdraft_bool 
    {
        %% Save the filehandle
        \DefineShortVerb{\;}
        \SaveVerb{CurrentFilehandle};\currfiledir\currfilename;
        \UndefineShortVerb{\;}
        %% create a box of zero total height and zero width
        \raisebox{-2ex}[0pt][0pt]{
            \makebox[0pt][l]{
                \footnotesize
                \textcolor{red}{#1:\hspace*{1em}\UseVerb{CurrentFilehandle}}
            }}
    }
}

\cs_new:Nn \fnc_aesection: 
    {
    \@startsection{section}{1}{0pt}
                  {2.5ex \@plus -0.5ex \@minus -0.5ex}
                  {2.5ex \@plus  0.5ex}
                  {\fnc_ae_currentfile:n {section}
                   \normalfont\Large\bfseries}
    }

\NewDocumentCommand\aesection{ om }
    {
    \fnc_aesection: {#2}
    }

\ExplSyntaxOff
\makeatother
\setroughdraft
%%--------------------------------------------------------------------------------
\usepackage{lipsum}
\pagestyle{empty}
\begin{document}

\input{hello}

\input{bye}

\end{document}

以下是文件的内容hello.tex

\aesection{Hello}

\lipsum[1]

以下是文件的内容bye.tex

\aesection{Bye}

\lipsum[2]

最终的文档结果如下:

在此处输入图片描述

再见取消设置草稿标志,输出为

在此处输入图片描述

希望您能看到,在草稿中我可以非常轻松地分辨出哪个文件产生了什么输出,并可以非常快速地编辑或修改该文件。

尽管如此,我对代码并不满意。首先,每个部分的开头都出现了一些不必要的额外空格。但这是因为我误用了\@startsection。我知道我使用不\@startsection正确:只有格式化命令应该出现在第六个参数中——而不是实际文本。

我想知道更好的方法。我觉得肯定有人也想做类似的事情。

我如何创建一个草稿,以便我能够轻松地告诉生成输出文档中的文本的源文件?

答案1

您可以保留\section语法,并使用 *-version 和可选参数。

\begin{filecontents}{elletthello.tex}
\section{Hello}

\lipsum[1]
\end{filecontents}
\begin{filecontents}{ellettbye.tex}
\section{Bye}

\lipsum[2]
\end{filecontents}

\documentclass{article}

\usepackage{xcolor}
\usepackage{currfile}
\usepackage{xparse}

%% keep the old meaning of \section
\let\latexsection\section

\ExplSyntaxOn
%% boolean for flaggging ROUGH DRAFT status
\bool_new:N \g_ae_roughdraft_bool
\bool_gset_false:N \g_ae_roughdraft_bool

\NewDocumentCommand \setroughdraft   {} { \bool_gset_true:N  \g_ae_roughdraft_bool }
\NewDocumentCommand \unsetroughdraft {} { \bool_gset_false:N \g_ae_roughdraft_bool }

\cs_new:Npn \ae_currentfile:n #1
 {
  \bool_if:NT \g_ae_roughdraft_bool 
   {
    %% Save the filehandle
    \tl_gset:Nx \g_ae_currentfile_tl {\currfiledir\currfilename}
    %% create a box of zero total height and zero width
    \raisebox{-1.5ex}[0pt][0pt]
     {
      \makebox[0pt][l]
       {
        \footnotesize\ttfamily
        \color{red}#1:~\currfiledir\currfilename
       }
     }
   }
 }

\RenewDocumentCommand\section{ som }
 {
  \IfBooleanTF{#1}
   { \latexsection*{\ae_currentfile:n{section} #3} }
   {
    \IfNoValueTF{#2}
     {
      \latexsection[#3]{\ae_currentfile:n{section} #3}
     }
     {
      \latexsection[#2]{\ae_currentfile:n{section} #3}
     }
   }
 }

\ExplSyntaxOff

\setroughdraft

\usepackage{lipsum}

\pagestyle{empty}
\begin{document}

\input{elletthello}

\input{ellettbye}

\end{document}

(查看函数和变量的名称。)

在此处输入图片描述

答案2

您的解决方案看起来太复杂了。以下是我在 ConTeXt 中执行此操作的方法。

ConTeXt 有一个项目-产品-组件模型,用于将大文件拆分为较小的文件。因此,每个包含的文件都是一个component,宏\currentcomponent给出了当前组件的名称。结合通常将内容放在部分后面的方法,我们得到:

\definehighlight
  [displayfile]
  [style=small, color=red]

\setuphead
  [section]
  [after={\setups{after:section}}]

\startsetups after:section
  \startmode[roughdraft]
    \blank[none]  
    \displayfile{section: \currentcomponent}
  \stopmode
  \blank[medium]
\stopsetups

\starttext

\component one
\component two

\stoptext

组件文件位于one.tex

\startcomponent *

\startsection[title={One}]
    \input lorem
\stopsection

\stopcomponent

two.tex

\startcomponent *

\startsection[title={Two}]
  \input lorem
\stopsection

\stopcomponent

要启用草稿模式,请使用

context --mode=roughdraft filename

这使

在此处输入图片描述

要禁用草稿模式,请按常规方式编译文档

context filename

这使

在此处输入图片描述

相关内容