我如何将下面的整个参数转换为%%%%
a 中的整个参数\newcommand
?我试过了,但出现错误。
\documentclass[a4paper]{memoir}
\usepackage[utf8]{inputenc}
\usepackage[T1]{fontenc}
\usepackage[brazil]{babel}
\usepackage{color,calc,graphicx,soul,fourier,lipsum}
%%%%%%%%%%%
% transform in newcommand
\makeatletter
\newlength\dlf@normtxtw
\setlength\dlf@normtxtw{\textwidth}
\def\myhelvetfont{\def\sfdefault{mdput}}
\newsavebox{\feline@chapter}
\newcommand\feline@chapter@marker[1][4cm]{%
\sbox\feline@chapter{%
\resizebox{!}{#1}{\fboxsep=1pt%
\colorbox{nicered}{\color{white}\bfseries\sffamily\thechapter}%
}
}%
\rotatebox{90}{%
\resizebox{%
\heightof{\usebox{\feline@chapter}}+\depthof{\usebox{\feline@chapter}}}%
{!}{\scshape\so\@chapapp}}\quad%
\raisebox{\depthof{\usebox{\feline@chapter}}}{\usebox{\feline@chapter}}%
}
\newcommand\feline@chm[1][4cm]{%
\sbox\feline@chapter{\feline@chapter@marker[#1]}%
\makebox[0pt][l]{% aka \rlap
\makebox[1cm][r]{\usebox\feline@chapter}%
}
}
\makechapterstyle{daleif1}{
\renewcommand\chapnamefont{\normalfont\Large\scshape\raggedleft\so}
\renewcommand\chaptitlefont{\normalfont\huge\bfseries\scshape\color{nicered}}
\renewcommand\chapternamenum{}
\renewcommand\printchaptername{}
\renewcommand\printchapternum{\null\hfill\feline@chm[2.5cm]\par}
\renewcommand\afterchapternum{\par\vskip\midchapskip}
\renewcommand\printchaptertitle[1]{\chaptitlefont\raggedleft ##1\par}
}
\makeatother
%%%%%%%%%%%
% sugestion
% \newcommand{\mydaleif}
\mydaleif
\chapterstyle{daleif1}
\begin{document}
\chapter{Daleif1 Chapter Style}
\lipsum
\end{document}
答案1
以下是您“建议”的实现:
\documentclass[a4paper]{memoir}
\usepackage[utf8]{inputenc}
\usepackage[T1]{fontenc}
\usepackage[brazil]{babel}
\usepackage{color,calc,graphicx,soul,fourier,lipsum}
%%%%%%%%%%%
% transformed into a \newcommand
\makeatletter
\newcommand{\mydaleif}{%
\newlength\dlf@normtxtw
\setlength\dlf@normtxtw{\textwidth}
\def\myhelvetfont{\def\sfdefault{mdput}}
\newsavebox{\feline@chapter}
\newcommand\feline@chapter@marker[1][4cm]{%
\sbox\feline@chapter{%
\resizebox{!}{##1}{\fboxsep=1pt%
\colorbox{red}{\color{white}\bfseries\sffamily\thechapter}%
}
}%
\rotatebox{90}{%
\resizebox{%
\heightof{\usebox{\feline@chapter}}+\depthof{\usebox{\feline@chapter}}}%
{!}{\scshape\so\@chapapp}}\quad%
\raisebox{\depthof{\usebox{\feline@chapter}}}{\usebox{\feline@chapter}}%
}
\newcommand\feline@chm[1][4cm]{%
\sbox\feline@chapter{\feline@chapter@marker[##1]}%
\makebox[0pt][l]{% aka \rlap
\makebox[1cm][r]{\usebox\feline@chapter}%
}
}
\makechapterstyle{daleif1}{
\renewcommand\chapnamefont{\normalfont\Large\scshape\raggedleft\so}
\renewcommand\chaptitlefont{\normalfont\huge\bfseries\scshape\color{red}}
\renewcommand\chapternamenum{}
\renewcommand\printchaptername{}
\renewcommand\printchapternum{\null\hfill\feline@chm[2.5cm]\par}
\renewcommand\afterchapternum{\par\vskip\midchapskip}
\renewcommand\printchaptertitle[1]{\chaptitlefont\raggedleft ####1\par}
}
}
\makeatother
%%%%%%%%%%%
\mydaleif
\chapterstyle{daleif1}
\begin{document}
\chapter{Daleif1 Chapter Style}
\lipsum
\end{document}
以下是一些注意事项:
虽然宏的内部可能需要一些
@
使用,因此需要\makeatletter
和\makeatother
修改对,但它们应该被使用外部宏定义。当你定义一个命令时之内另一个命令,并且“内部命令”将参数作为参数,则必须更改通过
#1
、等使用参数编号的方式。相反,您需要使用、等。#2
##1
##2
宏旨在封装一些可能经常使用的命令组,因此通常采用参数或实参以允许将来进行修改。但您当前的 并非如此
\mydaleif
。因此,我认为这种宏没什么用,因为您在定义它之后立即调用它,并且它在定义之后没有多大用处。但是,这可能只是因为我不知道实际用例。在某个范围或组中定义命令有其局限性。例如,考虑两个宏:
\newcommand{\mycmdone}{\newcommand{\testone}{Hello world 1.}} \newcommand{\mycmdtwo}{{\newcommand{\testtwo}{Hello world 2.}}}
执行
\mycmdone
和然后\testone
会打印Hello world 1.
,而执行\mycmdtwo
和\testtwo
会发出错误信号(Undefined control sequence
),因为\testtwo
是在组内定义的。请注意,\mycmdone
字面上被替换,\newcommand{..}{...}
而\mycmdtwo
被替换。对于或其他定义{\newcommand{..}{...}}
也是如此。\renewcommand
由于您没有包括的定义nicered
,我只是将其更改为red
。