![在环境内部定义变量,但在环境外部使用它](https://linux22.com/image/293267/%E5%9C%A8%E7%8E%AF%E5%A2%83%E5%86%85%E9%83%A8%E5%AE%9A%E4%B9%89%E5%8F%98%E9%87%8F%EF%BC%8C%E4%BD%86%E5%9C%A8%E7%8E%AF%E5%A2%83%E5%A4%96%E9%83%A8%E4%BD%BF%E7%94%A8%E5%AE%83.png)
如何在设置变量的环境之外使用变量?
按照下面给出的 MWE,如何在两个地方(环境内部和外部)打印变量?
\documentclass{article}
\usepackage[utf8]{inputenc}
\newcommand\referenceSente{}
\newcommand{\defReferenceSente}[1]{\renewcommand{\referenceSente}{#1}}
\newcommand{\printReferenceSente}{\referenceSente}
\newenvironment{myEnvironment}[1]{\defReferenceSente{#1}}
\begin{document}
\begin{myEnvironment}{keyword}
Inside environment : \printReferenceSente
\end{myEnvironment}
Outside environment : \printReferenceSente
\end{document}
答案1
LaTeX2e 没有提供在全局范围内定义宏的命令;您必须借助于类似 TeX 的东西\gdef
(读作“全局定义”)来实现这一点。
此外,你\printReferenceSente
在这里是多余的。
下面的代码应该可以完成您想要的操作。
\documentclass{article}
% initialise macro
\newcommand\referenceSente{}
% command for defining \referenceSente macro globally
\newcommand{\gdefReferenceSente}[1]
{\gdef\referenceSente{#1}}
\newenvironment{myEnvironment}[1]
{\gdefReferenceSente{#1}} % before
{\par} % after
\begin{document}
\begin{myEnvironment}{keyword}
Inside environment : \referenceSente
\end{myEnvironment}
Outside environment : \referenceSente
\end{document}
答案2
更接近您的代码的版本,\gdef
仅在真正重要的地方使用(正如 Jubobs 正确识别的那样) - “捕获”您的关键字,并使用他的简化而不需要特殊的打印命令......
\documentclass{article}
\usepackage[utf8]{inputenc}
\newcommand\referenceSente{}
\newcommand{\defReferenceSente}[1]{\gdef\referenceSente{#1}}
\newenvironment{myEnvironment}[1]{\defReferenceSente{#1}}{}
\begin{document}
\begin{myEnvironment}{keyword}
Inside environment : \referenceSente
\end{myEnvironment}
Outside environment : \referenceSente
\end{document}
编辑:原始示例在 的定义中只有一个(开始)组件;它通过在定义和 之间\newenvironment{myEnvironment}
添加一个空行(“静默”)来“保存” ,因为被解释为环境定义的第二个(必需)组件。如果删除空行,则会导致错误:\par
\begin{document}
\par
! LaTeX Error: Missing \begin{document}.
See the LaTeX manual or LaTeX Companion for explanation.
Type H <return> for immediate help.
...
l.7 \begin{d
ocument}
?
解决这个问题很容易——只需添加一个空组
{}
作为结束组件,不做任何事,只是使定义在语法上正确。(感谢 Jubobs 发现了这个故障。)