测试 Environ 中的 \BODY 是否为空

测试 Environ 中的 \BODY 是否为空

我想测试 中的字符串是否\expandafter\long\expandafter\xdef\csname\currfilebase\Introduction为空,以便不显示该部分。此环境introduction在 中的文件中定义P/Fourier.tex。当然,我在这里所做的不起作用。我尝试了许多 if 命令,\if...etoolbox似乎都不起作用。(在这里试过)。

\documentclass[11pt]{scrreprt}

\usepackage{currfile}
\usepackage{filehook}
\usepackage{environ}

\usepackage{etoolbox}


\def\Introduction{Introduction}


\NewEnviron{introduction}{%
      \expandafter\long\expandafter\xdef\csname\currfilebase\Introduction \endcsname{\expandafter\unexpanded\expandafter{\BODY}}%
}%


\AtEndOfIncludes{%
  \ifcurrfiledir{P/}{%
    \ifdefequal{\csname\currfilebase\Introduction\endcsname}{ }{True}{False}%
    \section{Introduction}%
    \csname \currfilebase \Introduction \endcsname}%
}%

\begin{document}    
\include{P/Fourier}
\end{document}

P/Fourier.tex包含

\begin{introduction}
Test
\end{introduction}

我有几个这样的环境,我希望它们不会显示在最终的 pdf 中。因此,如果文件为空,我会得到类似这样的结果: 例子

编辑:修复缺失部分}并删除了不相关的行。

编辑#2:我已将其更改为以下代码(带有etoolbox):

\ifcsvoid{\currfilebase\Introduction}{}{%
      \section{Introduction}%
      \csname\currfilebase\Introduction\endcsname}%

这似乎有效!这是一种好方法吗?谢谢大家,现在我也学到了,\show这对我很有帮助!

编辑#3:由于我已经在使用,etoolbox所以我也可以使用所有其他命令,所以

\newcommand{\makesection}[1]{\ifcsvoid{\currfilebase#1}{}%
  {%
    \section{#1}%
    \csuse{\currfilebase#1}%
  }%
}%

(我在其余部分也做了同样的事情)

答案1

乔纳斯,你所做的已经很不错了,而且很可能已经证明了自我回答的合理性。我只添加了一些小改动:

\documentclass[11pt]{scrreprt}

\usepackage{currfile}
\usepackage{filehook}
\usepackage{environ}

\usepackage{etoolbox}

\def\introductionname{Introduction}
\def\methodsname{Methods}
\def\ideasname{Ideas}

\newcommand\defenviron[1]{\NewEnviron{#1}{\expandafter\long\expandafter\xdef\csname\currfilebase #1\endcsname{\expandafter\unexpanded\expandafter{\BODY}}}}

\defenviron{introduction}
\defenviron{methods}
\defenviron{ideas}

\newcommand\makesection[1]{\ifcsvoid{\currfilebase #1}{}%
  {%
    \section{\csname#1name\endcsname}%
    \csuse{\currfilebase #1}%
  }%
}%

\AtEndOfIncludes{%
    \ifcurrfiledir{P/}{%
        \makesection{introduction}%
        \makesection{methods}%
        \makesection{ideas}%
        }{}%
}%

\begin{document}    
    \include{P/Fourier}
\end{document}

首先,\defenviron为了方便起见,我将这些环境定义放在它们自己的命令中。其次,我稍微改变了命名方案。然后,我还添加了缺失的 false 情况\ifcurrfiledir。但这就是全部了。

如果代码确实是这种统一的话,您可能还可以循环这两个地方的环境。

答案2

您的代码中缺少一个内容},如果我修复了它然后安排它以便它在我的目录设置中工作并添加

\expandafter\show\csname\currfilebase\Introduction\endcsname

就在你的考试之前我得到了

\env2-aIntroduction=\relax。

如果没有介绍,

> \env2-aIntroduction=\long macro:
->\ignorespaces .

如果有一个空的介绍。

因此,您需要测试它是否具有仅由其组成的定义\ignorespaces(或者不要\ignorespaces在您的定义中无条件添加)。

然后我停在

! Undefined control sequence.
\scr@ds@tocentry ->\convertchar 

我认为这是一个不相关的本地宏?所以我没有像平常一样包含文档的工作版本。

相关内容