在 C# 中,我们可以将类的某些属性指定为私有的、只读的等等。如果可能的话,我想在编写 LaTeX 文档类时应用这种方法。
我在网上或书籍上都找不到与此相关的文章。
以下是我的简化的文档类。
\ProvidesClass{pst-xport}[a cute document class for my own purpose.]
% .... others ....
\RequirePackage{pstricks}
\newcommand\Left{-1}
\newcommand\Right{1}
\newlength\LeftPadding\setlength{\LeftPadding}{1cm}
\newlength\RightPadding\setlength{\RightPadding}{1cm}
% it must be private
\newlength\PictureWidth
\AtBeginDocument
{
\setlength{\PictureWidth}{\dimexpr\Right\psxunit-\Left\psxunit\relax}
\paperwidth=\dimexpr\PictureWidth+\RightPadding+\LeftPadding\relax
% .... others ....
}
% .... others ....
% it must be private
\parindent=0pt
%%%%%%%%%%%%%%%%%%%%
%%%% INTERFACES %%%%
%%%%%%%%%%%%%%%%%%%%
\newcommand\SetPicture[2]
{
\renewcommand\Left{#1}
\renewcommand\Right{#3}
}
\newcommand\SetPadding[2]
{
\setlength{\LeftPadding}{#1}
\setlength{\RightPadding}{#3}
}
\newcommand\GetPaperWidth{\PictureWidth}
\endinput
我们按如下方式使用该文档类。
\documentclass{pst-xport}
\SetPicture{-2}{2}
\SetPadding{0.5cm}{0.5cm}
% \parindent must not be accessible in this input file.
\parindent=10pt
% \PictureWidth must not be accessible in this input file.
\setlength{\PictureWidth}{10cm}
\begin{document}
\parbox{\GetPictureWidth}
{
I can find a tool to convert
PDF to EPS in my neither
bathroom nor kitchen.
}
\end{document}
问题
如果可能的话,如何使文档类中定义的某些宏无法从外部访问?
答案1
您无法让宏完全无法从“外部”访问。即使是 TeX 基元也不受保护,可以重新定义(它们的名称,而不是它们的功能)。您只能给宏起一个非常特殊的名称,以避免意外更改并阻碍故意更改它们。
通常,不应由其他代码更改的内部宏包括@
通常不允许作为宏名称的一部分的 。可以使用 更改它\makeatletter
,然后使用 将其改回正常\makeatother
。此外,一个包的此类内部宏应该以特定前缀开头,该前缀通常由包名称构建。因此,不要将内部宏命名\foobar
为\xport@foobar
。这不会保护它免受一些真正想要更改它的用户的侵害,但他们可以认为自己受到了警告。
答案2
此外,您可能想要探索expl3
(LaTeX3 的一部分),它有自己的命名约定(与普通 TeX 和 LaTeX2 截然不同@
)。