📄 texinfo.tex
字号:
% This loses if there are any *other* active characters besides spaces% in the argument -- _ ^ +, for example -- since they get expanded.% Fortunately, Texinfo does not define any such commands. (If it ever% does, the catcode of the characters in questionwill have to be changed% here.) But this means we cannot call \removeactivespaces as part of% \argremovec{,omment}, since @c uses \parsearg, and thus the argument% that \parsearg gets might well have any character at all in it.%\def\removeactivespaces#1{% \begingroup \ignoreactivespaces \edef\temp{#1}% \global\toks0 = \expandafter{\temp}% \endgroup}% Change the active space to expand to nothing.%\begingroup \obeyspaces \gdef\ignoreactivespaces{\obeyspaces\let =\empty}\endgroup\def\flushcr{\ifx\par\lisppar \def\next##1{}\else \let\next=\relax \fi \next}%% These are used to keep @begin/@end levels from running away%% Call \inENV within environments (after a \begingroup)\newif\ifENV \ENVfalse \def\inENV{\ifENV\relax\else\ENVtrue\fi}\def\ENVcheck{%\ifENV\errmessage{Still within an environment; press RETURN to continue}\endgroup\fi} % This is not perfect, but it should reduce lossage% @begin foo is the same as @foo, for now.\newhelp\EMsimple{Press RETURN to continue.}\outer\def\begin{\parsearg\beginxxx}\def\beginxxx #1{%\expandafter\ifx\csname #1\endcsname\relax{\errhelp=\EMsimple \errmessage{Undefined command @begin #1}}\else\csname #1\endcsname\fi}% @end foo executes the definition of \Efoo.%\def\end{\parsearg\endxxx}\def\endxxx #1{% \removeactivespaces{#1}% \edef\endthing{\the\toks0}% % \expandafter\ifx\csname E\endthing\endcsname\relax \expandafter\ifx\csname \endthing\endcsname\relax % There's no \foo, i.e., no ``environment'' foo. \errhelp = \EMsimple \errmessage{Undefined command `@end \endthing'}% \else \unmatchedenderror\endthing \fi \else % Everything's ok; the right environment has been started. \csname E\endthing\endcsname \fi}% There is an environment #1, but it hasn't been started. Give an error.%\def\unmatchedenderror#1{% \errhelp = \EMsimple \errmessage{This `@end #1' doesn't have a matching `@#1'}%}% Define the control sequence \E#1 to give an unmatched @end error.%\def\defineunmatchedend#1{% \expandafter\def\csname E#1\endcsname{\unmatchedenderror{#1}}%}%% Simple single-character @ commands% @@ prints an @% Kludge this until the fonts are right (grr).\def\@{{\tt\char64}}% This is turned off because it was never documented% and you can use @w{...} around a quote to suppress ligatures.%% Define @` and @' to be the same as ` and '%% but suppressing ligatures.%\def\`{{`}}%\def\'{{'}}% Used to generate quoted braces.\def\mylbrace {{\tt\char123}}\def\myrbrace {{\tt\char125}}\let\{=\mylbrace\let\}=\myrbrace\begingroup % Definitions to produce \{ and \} commands for indices, % and @{ and @} for the aux file. \catcode`\{ = \other \catcode`\} = \other \catcode`\[ = 1 \catcode`\] = 2 \catcode`\! = 0 \catcode`\\ = \other !gdef!lbracecmd[\{]% !gdef!rbracecmd[\}]% !gdef!lbraceatcmd[@{]% !gdef!rbraceatcmd[@}]%!endgroup% Accents: @, @dotaccent @ringaccent @ubaraccent @udotaccent% Others are defined by plain TeX: @` @' @" @^ @~ @= @u @v @H.\let\, = \c\let\dotaccent = \.\def\ringaccent#1{{\accent23 #1}}\let\tieaccent = \t\let\ubaraccent = \b\let\udotaccent = \d% Other special characters: @questiondown @exclamdown% Plain TeX defines: @AA @AE @O @OE @L (plus lowercase versions) @ss.\def\questiondown{?`}\def\exclamdown{!`}% Dotless i and dotless j, used for accents.\def\imacro{i}\def\jmacro{j}\def\dotless#1{% \def\temp{#1}% \ifx\temp\imacro \ptexi \else\ifx\temp\jmacro \j \else \errmessage{@dotless can be used only with i or j}% \fi\fi}% Be sure we're in horizontal mode when doing a tie, since we make space% equivalent to this in @example-like environments. Otherwise, a space% at the beginning of a line will start with \penalty -- and% since \penalty is valid in vertical mode, we'd end up putting the% penalty on the vertical list instead of in the new paragraph.{\catcode`@ = 11 % Avoid using \@M directly, because that causes trouble % if the definition is written into an index file. \global\let\tiepenalty = \@M \gdef\tie{\leavevmode\penalty\tiepenalty\ }}% @: forces normal size whitespace following.\def\:{\spacefactor=1000 }% @* forces a line break.\def\*{\hfil\break\hbox{}\ignorespaces}% @/ allows a line break.\let\/=\allowbreak% @. is an end-of-sentence period.\def\.{.\spacefactor=3000 }% @! is an end-of-sentence bang.\def\!{!\spacefactor=3000 }% @? is an end-of-sentence query.\def\?{?\spacefactor=3000 }% @w prevents a word break. Without the \leavevmode, @w at the% beginning of a paragraph, when TeX is still in vertical mode, would% produce a whole line of output instead of starting the paragraph.\def\w#1{\leavevmode\hbox{#1}}% @group ... @end group forces ... to be all on one page, by enclosing% it in a TeX vbox. We use \vtop instead of \vbox to construct the box% to keep its height that of a normal line. According to the rules for% \topskip (p.114 of the TeXbook), the glue inserted is% max (\topskip - \ht (first item), 0). If that height is large,% therefore, no glue is inserted, and the space between the headline and% the text is small, which looks bad.%% Another complication is that the group might be very large. This can% cause the glue on the previous page to be unduly stretched, because it% does not have much material. In this case, it's better to add an% explicit \vfill so that the extra space is at the bottom. The% threshold for doing this is if the group is more than \vfilllimit% percent of a page (\vfilllimit can be changed inside of @tex).% \newbox\groupbox\def\vfilllimit{0.7}%\def\group{\begingroup \ifnum\catcode13=\active \else \errhelp = \groupinvalidhelp \errmessage{@group invalid in context where filling is enabled}% \fi % % The \vtop we start below produces a box with normal height and large % depth; thus, TeX puts \baselineskip glue before it, and (when the % next line of text is done) \lineskip glue after it. (See p.82 of % the TeXbook.) Thus, space below is not quite equal to space % above. But it's pretty close. \def\Egroup{% \egroup % End the \vtop. % \dimen0 is the vertical size of the group's box. \dimen0 = \ht\groupbox \advance\dimen0 by \dp\groupbox % \dimen2 is how much space is left on the page (more or less). \dimen2 = \pageheight \advance\dimen2 by -\pagetotal % if the group doesn't fit on the current page, and it's a big big % group, force a page break. \ifdim \dimen0 > \dimen2 \ifdim \pagetotal < \vfilllimit\pageheight \page \fi \fi \copy\groupbox \endgroup % End the \group. }% % \setbox\groupbox = \vtop\bgroup % We have to put a strut on the last line in case the @group is in % the midst of an example, rather than completely enclosing it. % Otherwise, the interline space between the last line of the group % and the first line afterwards is too small. But we can't put the % strut in \Egroup, since there it would be on a line by itself. % Hence this just inserts a strut at the beginning of each line. \everypar = {\strut}% % % Since we have a strut on every line, we don't need any of TeX's % normal interline spacing. \offinterlineskip % % OK, but now we have to do something about blank % lines in the input in @example-like environments, which normally % just turn into \lisppar, which will insert no space now that we've % turned off the interline space. Simplest is to make them be an % empty paragraph. \ifx\par\lisppar \edef\par{\leavevmode \par}% % % Reset ^^M's definition to new definition of \par. \obeylines \fi % % Do @comment since we are called inside an environment such as % @example, where each end-of-line in the input causes an % end-of-line in the output. We don't want the end-of-line after % the `@group' to put extra space in the output. Since @group % should appear on a line by itself (according to the Texinfo % manual), we don't worry about eating any user text. \comment}%% TeX puts in an \escapechar (i.e., `@') at the beginning of the help% message, so this ends up printing `@group can only ...'.%\newhelp\groupinvalidhelp{%group can only be used in environments such as @example,^^J%where each line of input produces a line of output.}% @need space-in-mils% forces a page break if there is not space-in-mils remaining.\newdimen\mil \mil=0.001in\def\need{\parsearg\needx}% Old definition--didn't work.%\def\needx #1{\par %%% This method tries to make TeX break the page naturally%% if the depth of the box does not fit.%{\baselineskip=0pt%%\vtop to #1\mil{\vfil}\kern -#1\mil\nobreak%\prevdepth=-1000pt%}}\def\needx#1{% % Ensure vertical mode, so we don't make a big box in the middle of a % paragraph. \par % % If the @need value is less than one line space, it's useless. \dimen0 = #1\mil \dimen2 = \ht\strutbox \advance\dimen2 by \dp\strutbox \ifdim\dimen0 > \dimen2 % % Do a \strut just to make the height of this box be normal, so the % normal leading is inserted relative to the preceding line. % And a page break here is fine. \vtop to #1\mil{\strut\vfil}% % % TeX does not even consider page breaks if a penalty added to the % main vertical list is 10000 or more. But in order to see if the % empty box we just added fits on the page, we must make it consider % page breaks. On the other hand, we don't want to actually break the % page after the empty box. So we use a penalty of 9999. % % There is an extremely small chance that TeX will actually break the % page at this \penalty, if there are no other feasible breakpoints in % sight. (If the user is using lots of big @group commands, which % almost-but-not-quite fill up a page, TeX will have a hard time doing % good page breaking, for example.) However, I could not construct an % example where a page broke at this \penalty; if it happens in a real % document, then we can reconsider our strategy. \penalty9999 % % Back up by the size of the box, whether we did a page break or not. \kern -#1\mil % % Do not allow a page break right after this kern. \nobreak \fi}% @br forces paragraph break\let\br = \par% @dots{} output an ellipsis using the current font.% We do .5em per period so that it has the same spacing in a typewriter% font as three actual period characters.%\def\dots{% \leavevmode \hbox to 1.5em{% \hskip 0pt plus 0.25fil minus 0.25fil .\hss.\hss.% \hskip 0pt plus 0.5fil minus 0.5fil }%}% @enddots{} is an end-of-sentence ellipsis.%\def\enddots{% \leavevmode \hbox to 2em{% \hskip 0pt plus 0.25fil minus 0.25fil .\hss.\hss.\hss.% \hskip 0pt plus 0.5fil minus 0.5fil }% \spacefactor=3000}% @page forces the start of a new page.%\def\page{\par\vfill\supereject}% @exdent text....% outputs text on separate line in roman font, starting at standard page margin% This records the amount of indent in the innermost environment.% That's how much \exdent should take out.\newskip\exdentamount% This defn is used inside fill environments such as @defun.\def\exdent{\parsearg\exdentyyy}\def\exdentyyy #1{{\hfil\break\hbox{\kern -\exdentamount{\rm#1}}\hfil\break}}% This defn is used inside nofill environments such as @example.\def\nofillexdent{\parsearg\nofillexdentyyy}\def\nofillexdentyyy #1{{\advance \leftskip by -\exdentamount\leftline{\hskip\leftskip{\rm#1}}}}% @inmargin{WHICH}{TEXT} puts TEXT in the WHICH margin next to the current% paragraph. For more general purposes, use the \margin insertion% class. WHICH is `l' or `r'.%\newskip\inmarginspacing \inmarginspacing=1cm\def\strutdepth{\dp\strutbox}%\def\doinmargin#1#2{\strut\vadjust{% \nobreak \kern-\strutdepth \vtop to \strutdepth{% \baselineskip=\strutdepth \vss % if you have multiple lines of stuff to put here, you'll need to % make the vbox yourself of the appropriate size. \ifx#1l% \llap{\ignorespaces #2\hskip\inmarginspacing}% \else \rlap{\hskip\hsize \hskip\inmarginspacing \ignorespaces #2}% \fi \null }%}}\def\inleftmargin{\doinmargin l}\def\inrightmargin{\doinmargin r}%% @inmargin{TEXT [, RIGHT-TEXT]}% (if RIGHT-TEXT is given, use TEXT for left page, RIGHT-TEXT for right;% else use TEXT for both).% \def\inmargin#1{\parseinmargin #1,,\finish}\def\parseinmargin#1,#2,#3\finish{% not perfect, but better than nothing.
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -