我想测试 中的字符串是否\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
我认为这是一个不相关的本地宏?所以我没有像平常一样包含文档的工作版本。