我遇到了一个问题,我认为除了变通方法外,无法解决。我想预定义页面,然后稍后将其插入文档中。问题是,这\par
(如果在预定义页面中使用)会导致错误。
这是我的 MnWE:
\documentclass[12pt,a4paper]{article}
\usepackage[utf8]{inputenc}
\usepackage[german]{babel}
\usepackage{amsmath}
\usepackage{amsfonts}
\usepackage{amssymb}
\usepackage{graphicx}
\usepackage{blindtext}
\makeatletter
%%%%makes a \page_#1 which expands to #2
\def\setpage#1#2{
\expandafter\def\csname page_#1\endcsname {
\newpage
#2
\clearpage
}
}
%%%%call the pages
\def\callpage#1{
\csname page_#1\endcsname
}
%%%%define pre-defined pages
\setpage{1}{insert Seite \par
\blindtext
}
\setpage{2}{insert Seite2 % note the implicit \par here
}
\begin{document}
Text
\callpage{1}
\callpage{2}
Wieder Text
\end{document}
我尝试通过以下方式重新定义\par
内部\setpage
\def\par{\mbox{} \linebreak \indent}
但这是不可编译的(内存错误)。
我的\setpage
命令应生成一个包含参数内容的单独页面#1
。参数应采用任何内容,也可以写在\begin{document}
和之间\end{document}
。
答案1
一些评论:
带有段落(标记)的“长”参数
\par
只能用于宏,宏的定义为\long
:\long\def\macro
。这是 的默认设置\newcommand
。\setpage
需要以这种方式定义。\callpage
但是, 不应允许\par
标记,因为 中禁止使用标记。它可以用或星号形式\csname
来定义。\def
\newcommand*
由于
\makeatletter
处于活动状态,以下示例使用\@namedef
和\@nameuse
将冗长的表达式替换为\csname
具有更易于理解的宏名的宏。例如,如果在命令序列名称之后没有被忽略,行尾通常会被 TeX 转换为空格。在垂直模式下,它们不会造成任何损害,但在水平模式下它们不会被忽略。以下示例通过在需要时注释行尾来避免这种情况。
完整示例:
\documentclass[12pt,a4paper]{article}
\usepackage{blindtext}
\makeatletter
%%%%makes a \page_#1 which expands to #2
\newcommand{\setpage}[2]{%
\@namedef{page_#1}{%
\newpage
#2%
\clearpage
}%
}
%%%%call the pages
\newcommand*{\callpage}[1]{%
\@nameuse{page_#1}%
}
%%%%define pre-defined pages
\setpage{1}{insert Seite \par
\blindtext
}
\setpage{2}{insert Seite2 % note the implicit \par here
}
\makeatother
\begin{document}
Text
\callpage{1}
\callpage{2}
Wieder Text
\end{document}
答案2
你认为这个\def
更短是错误的。也许从字符数上看它更短,但它可以让你免于在出现一些奇怪的错误时抓狂。
假设您加载了一个仅使用部分功能的包,但是\setpage
当调用您利用的功能时,该包使用一个名为的宏作为其工作的一部分。
你能看出什么地方出了问题吗?
在这种情况下,使用\newcommand
会告诉您该名称已被使用,您只需说“好的,让我更改名称”。
正确的定义如下。
\newcommand\setpage[2]{%
\expandafter\def\csname glanz@page@#1\endcsname{%
\newpage
#2%
\clearpage
}%
}
\newcommand\callpage[1]{%
\csname glanz@page@#1\endcsname
}
使用@
比 更安全_
(某些包会_
激活,您的使用可能会中断)。此外,添加前缀将模拟“命名空间”,从而最大限度地降低重新定义已采用的宏的风险。
请注意%
保护行尾。
用 定义的宏\newcommand
是自动的\long
,因此它们允许\par
在其参数中。