我肯定是在这里重新发明轮子了。
我正在编写一个相当长的文档,其中每个部分都对应其自己的输入文件。基本上,我有一个类似于以下内容的母文档:
%% 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
这使