Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(824)

Side by Side Diff: docs/language/dartLangSpec.tex

Issue 2316483002: Adjusted grammar in spec to handle nullability token `?`.
Patch Set: Added two questionmarks that I forgot at first. Created 4 years, 3 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « no previous file | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 \documentclass{article} 1 \documentclass{article}
2 \usepackage{epsfig} 2 \usepackage{epsfig}
3 \usepackage{color} 3 \usepackage{color}
4 \usepackage{dart} 4 \usepackage{dart}
5 \usepackage{bnf} 5 \usepackage{bnf}
6 \usepackage{hyperref} 6 \usepackage{hyperref}
7 \usepackage{lmodern} 7 \usepackage{lmodern}
8 \newcommand{\code}[1]{{\sf #1}} 8 \newcommand{\code}[1]{{\sf #1}}
9 \title{Dart Programming Language Specification \\ 9 \title{Dart Programming Language Specification \\
10 {4th edition draft}\\ 10 {4th edition draft}\\
(...skipping 689 matching lines...) Expand 10 before | Expand all | Expand 10 after
700 700
701 \LMHash{} 701 \LMHash{}
702 A {\em required formal parameter} may be specified in one of three ways: 702 A {\em required formal parameter} may be specified in one of three ways:
703 \begin{itemize} 703 \begin{itemize}
704 \item By means of a function signature that names the parameter and describes it s type as a function type (\ref{functionTypes}). It is a compile-time error if any default values are specified in the signature of such a function type.% expl ain what the type is in this case? Where is this described in general? 704 \item By means of a function signature that names the parameter and describes it s type as a function type (\ref{functionTypes}). It is a compile-time error if any default values are specified in the signature of such a function type.% expl ain what the type is in this case? Where is this described in general?
705 \item As an initializing formal, which is only valid as a parameter to a generat ive constructor (\ref{generativeConstructors}). % do we need to say this, or any thing more? 705 \item As an initializing formal, which is only valid as a parameter to a generat ive constructor (\ref{generativeConstructors}). % do we need to say this, or any thing more?
706 \item Via an ordinary variable declaration (\ref{variables}). 706 \item Via an ordinary variable declaration (\ref{variables}).
707 \end{itemize} 707 \end{itemize}
708 708
709 \begin{grammar} 709 \begin{grammar}
710 {\bf normalFormalParameter:}functionSignature; 710 {\bf normalFormalParameter:}functionSignature `?'?;
711 fieldFormalParameter; 711 fieldFormalParameter;
712 simpleFormalParameter 712 simpleFormalParameter
713 . 713 .
714 714
715 {\bf simpleFormalParameter:}declaredIdentifier; 715 {\bf simpleFormalParameter:}declaredIdentifier;
716 metadata identifier 716 metadata identifier
717 . 717 .
718 718
719 {\bf fieldFormalParameter:} 719 {\bf fieldFormalParameter:}
720 metadata finalConstVarOrType? \THIS{} `{\escapegrammar .}' identifier formalP arameterList? 720 metadata finalConstVarOrType? \THIS{} `{\escapegrammar .}' identifier formalP arameterList?
(...skipping 92 matching lines...) Expand 10 before | Expand all | Expand 10 after
813 A {\em class} defines the form and behavior of a set of objects which are its {\ em instances}. Classes may be defined by class declarations as described below, or via mixin applications (\ref{mixinApplication}). 813 A {\em class} defines the form and behavior of a set of objects which are its {\ em instances}. Classes may be defined by class declarations as described below, or via mixin applications (\ref{mixinApplication}).
814 814
815 \begin{grammar} 815 \begin{grammar}
816 {\bf classDefinition:} 816 {\bf classDefinition:}
817 metadata \ABSTRACT{}? \CLASS{} identifier typeParameters? (superclass mixins?)? interfaces? \\ 817 metadata \ABSTRACT{}? \CLASS{} identifier typeParameters? (superclass mixins?)? interfaces? \\
818 `\{' (metadata classMemberDefinition)* `\}'; 818 `\{' (metadata classMemberDefinition)* `\}';
819 819
820 metadata \ABSTRACT{}? \CLASS{} mixinApplicationClass 820 metadata \ABSTRACT{}? \CLASS{} mixinApplicationClass
821 . 821 .
822 822
823 {\bf classDenotation:}
824 className typeArguments?
Lasse Reichstein Nielsen 2017/05/30 10:52:30 className is equivalent to typeName, so this could
825 .
826
827 {\bf className:}
828 qualified
829 .
830
831 {\bf classDenotationList:}
832 classDenotation (`,$\!\!$' classDenotation)*
833 .
834
823 {\bf mixins:} 835 {\bf mixins:}
824 \WITH{} typeList 836 \WITH{} classDenotationList
825 . 837 .
826 838
827 {\bf classMemberDefinition:}declaration `{\escapegrammar ;}' ; 839 {\bf classMemberDefinition:}declaration `{\escapegrammar ;}' ;
828 methodSignature functionBody 840 methodSignature functionBody
829 . 841 .
830 842
831 {\bf methodSignature:}constructorSignature initializers?; 843 {\bf methodSignature:}constructorSignature initializers?;
832 factoryConstructorSignature; 844 factoryConstructorSignature;
833 \STATIC{}? functionSignature; 845 \STATIC{}? functionSignature;
834 \STATIC{}? getterSignature; 846 \STATIC{}? getterSignature;
(...skipping 596 matching lines...) Expand 10 before | Expand all | Expand 10 after
1431 } 1443 }
1432 1444
1433 \paragraph{Redirecting Factory Constructors} 1445 \paragraph{Redirecting Factory Constructors}
1434 \LMLabel{redirectingFactoryConstructors} 1446 \LMLabel{redirectingFactoryConstructors}
1435 1447
1436 \LMHash{} 1448 \LMHash{}
1437 A {\em redirecting factory constructor} specifies a call to a constructor of ano ther class that is to be used whenever the redirecting constructor is called. 1449 A {\em redirecting factory constructor} specifies a call to a constructor of ano ther class that is to be used whenever the redirecting constructor is called.
1438 1450
1439 \begin{grammar} 1451 \begin{grammar}
1440 {\bf redirectingFactoryConstructorSignature:} 1452 {\bf redirectingFactoryConstructorSignature:}
1441 \CONST{}? \FACTORY{} identifier (`{\escapegrammar .}' identifier)? formalP arameterList `=' type (`{\escapegrammar .}' identifier)? 1453 \CONST{}? \FACTORY{} identifier (`{\escapegrammar .}' identifier)? formalP arameterList `=' classDenotation (`{\escapegrammar .}' identifier)?
1442 . 1454 .
1443 \end{grammar} 1455 \end{grammar}
1444 1456
1445 \LMHash{} 1457 \LMHash{}
1446 Calling a redirecting factory constructor $k$ causes the constructor $k^\prime$ denoted by $type$ (respectively, $type.identifier$) to be called with the actual arguments passed to $k$, and returns the result of $k^\prime$ as the result of $k$. The resulting constructor call is governed by the same rules as an instanc e creation expression using \NEW{} (\ref{instanceCreation}). 1458 Calling a redirecting factory constructor $k$ causes the constructor $k^\prime$ denoted by $type$ (respectively, $type.identifier$) to be called with the actual arguments passed to $k$, and returns the result of $k^\prime$ as the result of $k$. The resulting constructor call is governed by the same rules as an instanc e creation expression using \NEW{} (\ref{instanceCreation}).
1447 1459
1448 \commentary{ 1460 \commentary{
1449 It follows that if $type$ or $type.id$ are not defined, or do not refer to a cla ss or constructor, a dynamic error occurs, as with any other undefined construct or call. The same holds if $k$ is called with fewer required parameters or more positional parameters than $k^\prime$ expects, or if $k$ is called with a named parameter that is not declared by $k^\prime$. 1461 It follows that if $type$ or $type.id$ are not defined, or do not refer to a cla ss or constructor, a dynamic error occurs, as with any other undefined construct or call. The same holds if $k$ is called with fewer required parameters or more positional parameters than $k^\prime$ expects, or if $k$ is called with a named parameter that is not declared by $k^\prime$.
1450 } 1462 }
1451 1463
(...skipping 257 matching lines...) Expand 10 before | Expand all | Expand 10 after
1709 \begin{itemize} 1721 \begin{itemize}
1710 \item $C$ is \code{Object}, which has no superclass. OR 1722 \item $C$ is \code{Object}, which has no superclass. OR
1711 \item Class $C$ is deemed to have an \EXTENDS{} clause of the form \code{\EXTEN DS{} Object}, and the rules above apply. 1723 \item Class $C$ is deemed to have an \EXTENDS{} clause of the form \code{\EXTEN DS{} Object}, and the rules above apply.
1712 \end{itemize} 1724 \end{itemize}
1713 1725
1714 \LMHash{} 1726 \LMHash{}
1715 It is a compile-time error to specify an \EXTENDS{} clause for class \code{Objec t}. 1727 It is a compile-time error to specify an \EXTENDS{} clause for class \code{Objec t}.
1716 1728
1717 \begin{grammar} 1729 \begin{grammar}
1718 {\bf superclass:} 1730 {\bf superclass:}
1719 \EXTENDS{} type 1731 \EXTENDS{} classDenotation
1720 . 1732 .
1721 \end{grammar} 1733 \end{grammar}
1722 1734
1723 %The superclass clause of a class C is processed within the enclosing scope of t he static scope of C. 1735 %The superclass clause of a class C is processed within the enclosing scope of t he static scope of C.
1724 %\commentary{ 1736 %\commentary{
1725 %This means that in a generic class, the type parameters of the generic are avai lable in the superclass clause. 1737 %This means that in a generic class, the type parameters of the generic are avai lable in the superclass clause.
1726 %} 1738 %}
1727 1739
1728 \LMHash{} 1740 \LMHash{}
1729 The scope of the \EXTENDS{} and \WITH{} clauses of a class $C$ is the type-param eter scope of $C$. 1741 The scope of the \EXTENDS{} and \WITH{} clauses of a class $C$ is the type-param eter scope of $C$.
(...skipping 120 matching lines...) Expand 10 before | Expand all | Expand 10 after
1850 \subsection{ Superinterfaces} 1862 \subsection{ Superinterfaces}
1851 \LMLabel{superinterfaces} 1863 \LMLabel{superinterfaces}
1852 % what about rules about classes that fail to implement their interfaces? 1864 % what about rules about classes that fail to implement their interfaces?
1853 1865
1854 \LMHash{} 1866 \LMHash{}
1855 A class has a set of direct superinterfaces. This set includes the interface of its superclass and the interfaces specified in the \IMPLEMENTS{} clause of the class. 1867 A class has a set of direct superinterfaces. This set includes the interface of its superclass and the interfaces specified in the \IMPLEMENTS{} clause of the class.
1856 % and any superinterfaces specified by interface injection (\ref{interfaceInject ion}). \Q{The latter needs to be worded carefully - when do interface injection clauses execute and in what scope?} 1868 % and any superinterfaces specified by interface injection (\ref{interfaceInject ion}). \Q{The latter needs to be worded carefully - when do interface injection clauses execute and in what scope?}
1857 1869
1858 \begin{grammar} 1870 \begin{grammar}
1859 {\bf interfaces:} 1871 {\bf interfaces:}
1860 \IMPLEMENTS{} typeList 1872 \IMPLEMENTS{} classDenotationList
1861 . 1873 .
1862 \end{grammar} 1874 \end{grammar}
1863 1875
1864 \LMHash{} 1876 \LMHash{}
1865 The scope of the \IMPLEMENTS{} clause of a class $C$ is the type-parameter scope of $C$. 1877 The scope of the \IMPLEMENTS{} clause of a class $C$ is the type-parameter scope of $C$.
1866 1878
1867 \LMHash{} 1879 \LMHash{}
1868 It is a compile-time error if the \IMPLEMENTS{} clause of a class $C$ specifie s a type variable as a superinterface. It is a compile-time error if the \IMPL EMENTS{} clause of a class $C$ specifies an enumerated type (\ref{enums}), a ma lformed type or deferred type (\ref{staticTypes}) as a superinterface. It is a compile-time error if the \IMPLEMENTS{} clause of a class $C$ specifies type \DY NAMIC{} as a superinterface. It is a compile-time error if the \IMPLEMENTS{} c lause of a class $C$ specifies a type $T$ as a superinterface more than once. 1880 It is a compile-time error if the \IMPLEMENTS{} clause of a class $C$ specifie s a type variable as a superinterface. It is a compile-time error if the \IMPL EMENTS{} clause of a class $C$ specifies an enumerated type (\ref{enums}), a ma lformed type or deferred type (\ref{staticTypes}) as a superinterface. It is a compile-time error if the \IMPLEMENTS{} clause of a class $C$ specifies type \DY NAMIC{} as a superinterface. It is a compile-time error if the \IMPLEMENTS{} c lause of a class $C$ specifies a type $T$ as a superinterface more than once.
1869 It is a compile-time error if the superclass of a class $C$ is specified as a su perinterface of $C$. 1881 It is a compile-time error if the superclass of a class $C$ is specified as a su perinterface of $C$.
1870 1882
1871 \rationale{ 1883 \rationale{
(...skipping 167 matching lines...) Expand 10 before | Expand all | Expand 10 after
2039 2051
2040 \LMHash{} 2052 \LMHash{}
2041 A mixin may be applied to a superclass, yielding a new class. Mixin application occurs when a mixin is mixed into a class declaration via its \WITH{} clause. T he mixin application may be used to extend a class per section (\ref{classes}); alternately, a class may be defined as a mixin application as described in this section. It is a compile-time error if the \WITH{} clause of a mixin applicati on $C$ includes a deferred type expression. 2053 A mixin may be applied to a superclass, yielding a new class. Mixin application occurs when a mixin is mixed into a class declaration via its \WITH{} clause. T he mixin application may be used to extend a class per section (\ref{classes}); alternately, a class may be defined as a mixin application as described in this section. It is a compile-time error if the \WITH{} clause of a mixin applicati on $C$ includes a deferred type expression.
2042 2054
2043 2055
2044 \begin{grammar} 2056 \begin{grammar}
2045 {\bf mixinApplicationClass:} 2057 {\bf mixinApplicationClass:}
2046 identifier typeParameters? `=' mixinApplication `{\escapegrammar ;}' . 2058 identifier typeParameters? `=' mixinApplication `{\escapegrammar ;}' .
2047 2059
2048 {\bf mixinApplication:} 2060 {\bf mixinApplication:}
2049 type mixins interfaces? 2061 classDenotation mixins interfaces?
2050 . 2062 .
2051 \end{grammar} 2063 \end{grammar}
2052 2064
2053 \LMHash{} 2065 \LMHash{}
2054 A mixin application of the form \code{$S$ \WITH{} $M$;} defines a class $C$ w ith superclass $S$. 2066 A mixin application of the form \code{$S$ \WITH{} $M$;} defines a class $C$ w ith superclass $S$.
2055 2067
2056 \LMHash{} 2068 \LMHash{}
2057 A mixin application of the form \code{$S$ \WITH{} $M_1, \ldots, M_k$;} defines a class $C$ whose superclass is the application of the mixin composition (\ref {mixinComposition}) $M_{k-1} * \ldots * M_1$ to $S$. 2069 A mixin application of the form \code{$S$ \WITH{} $M_1, \ldots, M_k$;} defines a class $C$ whose superclass is the application of the mixin composition (\ref {mixinComposition}) $M_{k-1} * \ldots * M_1$ to $S$.
2058 2070
2059 \LMHash{} 2071 \LMHash{}
(...skipping 297 matching lines...) Expand 10 before | Expand all | Expand 10 after
2357 . 2369 .
2358 \end{grammar} 2370 \end{grammar}
2359 2371
2360 \begin{grammar} 2372 \begin{grammar}
2361 {\bf primary:}thisExpression; 2373 {\bf primary:}thisExpression;
2362 \SUPER{} unconditionalAssignableSelector; 2374 \SUPER{} unconditionalAssignableSelector;
2363 functionExpression; 2375 functionExpression;
2364 literal; 2376 literal;
2365 identifier; 2377 identifier;
2366 newExpression; 2378 newExpression;
2367 \NEW{} type `\#' (`{\escapegrammar .}' identifier)?; 2379 \NEW{} classDenotation `\#' (`{\escapegrammar .}' identifier)?;
2368 constObjectExpression; 2380 constObjectExpression;
2369 `(' expression `)' 2381 `(' expression `)'
2370 . 2382 .
2371 2383
2372 \end{grammar} 2384 \end{grammar}
2373 2385
2374 \LMHash{} 2386 \LMHash{}
2375 An expression $e$ may always be enclosed in parentheses, but this never has any semantic effect on $e$. 2387 An expression $e$ may always be enclosed in parentheses, but this never has any semantic effect on $e$.
2376 2388
2377 \commentary{ 2389 \commentary{
(...skipping 902 matching lines...) Expand 10 before | Expand all | Expand 10 after
3280 3292
3281 3293
3282 \subsubsection{ New} 3294 \subsubsection{ New}
3283 \LMLabel{new} 3295 \LMLabel{new}
3284 3296
3285 \LMHash{} 3297 \LMHash{}
3286 The {\em new expression} invokes a constructor (\ref{constructors}). 3298 The {\em new expression} invokes a constructor (\ref{constructors}).
3287 3299
3288 \begin{grammar} 3300 \begin{grammar}
3289 {\bf newExpression:} 3301 {\bf newExpression:}
3290 \NEW{} type (`{\escapegrammar .}' identifier)? arguments 3302 \NEW{} classDenotation (`{\escapegrammar .}' identifier)? arguments
3291 . 3303 .
3292 \end{grammar} 3304 \end{grammar}
3293 3305
3294 \LMHash{} 3306 \LMHash{}
3295 Let $e$ be a new expression of the form 3307 Let $e$ be a new expression of the form
3296 3308
3297 \NEW{} $T.id(a_1, \ldots , a_n, x_{n+1}: a_{n+1}, \ldots , x_{n+k}: a_{n+k})$ or the form 3309 \NEW{} $T.id(a_1, \ldots , a_n, x_{n+1}: a_{n+1}, \ldots , x_{n+k}: a_{n+k})$ or the form
3298 3310
3299 \NEW{} $T(a_1, \ldots , a_n, x_{n+1}: a_{n+1}, \ldots , x_{n+k}: a_{n+k})$. 3311 \NEW{} $T(a_1, \ldots , a_n, x_{n+1}: a_{n+1}, \ldots , x_{n+k}: a_{n+k})$.
3300 3312
3301 %It is a runtime type error if 3313 %It is a runtime type error if
(...skipping 96 matching lines...) Expand 10 before | Expand all | Expand 10 after
3398 3410
3399 3411
3400 \subsubsection{ Const} 3412 \subsubsection{ Const}
3401 \LMLabel{const} 3413 \LMLabel{const}
3402 3414
3403 \LMHash{} 3415 \LMHash{}
3404 A {\em constant object expression} invokes a constant constructor (\ref{constant Constructors}). 3416 A {\em constant object expression} invokes a constant constructor (\ref{constant Constructors}).
3405 3417
3406 \begin{grammar} 3418 \begin{grammar}
3407 {\bf constObjectExpression:} 3419 {\bf constObjectExpression:}
3408 \CONST{} type ('{\escapegrammar .}' identifier)? arguments 3420 \CONST{} classDenotation ('{\escapegrammar .}' identifier)? arguments
Lasse Reichstein Nielsen 2017/05/30 10:52:30 ' -> ` maybe?
3409 . 3421 .
3410 \end{grammar} 3422 \end{grammar}
3411 3423
3412 \LMHash{} 3424 \LMHash{}
3413 Let $e$ be a constant object expression of the form 3425 Let $e$ be a constant object expression of the form
3414 3426
3415 \CONST{} $T.id(a_1, \ldots , a_n, x_{n+1}: a_{n+1}, \ldots , x_{n+k}: a_{n+k})$ 3427 \CONST{} $T.id(a_1, \ldots , a_n, x_{n+1}: a_{n+1}, \ldots , x_{n+k}: a_{n+k})$
3416 3428
3417 or the form \CONST{} $T(a_1, \ldots , a_n, x_{n+1}: a_{n+1}, \ldots , x_{n+k}: a_{n+k})$. It is a compile-time error if $T$ does not denote a class accessible in the current scope. It is a compile-time error if $T$ is a deferred type (\re f{staticTypes}). 3429 or the form \CONST{} $T(a_1, \ldots , a_n, x_{n+1}: a_{n+1}, \ldots , x_{n+k}: a_{n+k})$. It is a compile-time error if $T$ does not denote a class accessible in the current scope. It is a compile-time error if $T$ is a deferred type (\re f{staticTypes}).
3418 3430
3419 \commentary{In particular, $T$ may not be a type variable.} 3431 \commentary{In particular, $T$ may not be a type variable.}
(...skipping 3604 matching lines...) Expand 10 before | Expand all | Expand 10 after
7024 } 7036 }
7025 7037
7026 \subsection{Static Types} 7038 \subsection{Static Types}
7027 \LMLabel{staticTypes} 7039 \LMLabel{staticTypes}
7028 7040
7029 \LMHash{} 7041 \LMHash{}
7030 Static type annotations are used in variable declarations (\ref{variables}) (inc luding formal parameters (\ref{formalParameters})), in the return types of funct ions (\ref{functions}) and in the bounds of type variables. Static type annotat ions are used during static checking and when running programs in checked mode. They have no effect whatsoever in production mode. 7042 Static type annotations are used in variable declarations (\ref{variables}) (inc luding formal parameters (\ref{formalParameters})), in the return types of funct ions (\ref{functions}) and in the bounds of type variables. Static type annotat ions are used during static checking and when running programs in checked mode. They have no effect whatsoever in production mode.
7031 7043
7032 \begin{grammar} 7044 \begin{grammar}
7033 {\bf type:} 7045 {\bf type:}
7034 typeName typeArguments? 7046 typeName typeArguments? `?'?
7035 . 7047 .
7036 7048
7037 {\bf typeName:} 7049 {\bf typeName:}
7038 qualified 7050 qualified
7039 . 7051 .
7040 7052
7041 {\bf typeArguments:} 7053 {\bf typeArguments:}
7042 '<' typeList '>' 7054 '<' typeList '>'
Lasse Reichstein Nielsen 2017/05/30 10:52:30 The quotes here look wrong, should they be `<' and
7043 . 7055 .
7044 7056
7045 {\bf typeList:} 7057 {\bf typeList:}
7046 type (',' type)* 7058 type (',' type)*
Lasse Reichstein Nielsen 2017/05/30 10:52:30 Add $\!\!$ here too?
7047 . 7059 .
7048 \end{grammar} 7060 \end{grammar}
7049 7061
7050 \LMHash{} 7062 \LMHash{}
7051 A Dart implementation must provide a static checker that detects and reports exa ctly those situations this specification identifies as static warnings and only those situations. However: 7063 A Dart implementation must provide a static checker that detects and reports exa ctly those situations this specification identifies as static warnings and only those situations. However:
7052 \begin{itemize} 7064 \begin{itemize}
7053 \item Running the static checker on a program $P$ is not required for compiling and running $P$. 7065 \item Running the static checker on a program $P$ is not required for compiling and running $P$.
7054 \item Running the static checker on a program $P$ must not prevent successful co mpilation of $P$ nor may it prevent the execution of $P$, regardless of whether any static warnings occur. 7066 \item Running the static checker on a program $P$ must not prevent successful co mpilation of $P$ nor may it prevent the execution of $P$, regardless of whether any static warnings occur.
7055 \end{itemize} 7067 \end{itemize}
7056 7068
(...skipping 840 matching lines...) Expand 10 before | Expand all | Expand 10 after
7897 7909
7898 The invariant that each normative paragraph is associated with a line 7910 The invariant that each normative paragraph is associated with a line
7899 containing the text \LMHash{} should be maintained. Extra occurrences 7911 containing the text \LMHash{} should be maintained. Extra occurrences
7900 of \LMHash{} can be added if needed, e.g., in order to make 7912 of \LMHash{} can be added if needed, e.g., in order to make
7901 individual \item{}s in itemized lists addressable. Each \LM.. command 7913 individual \item{}s in itemized lists addressable. Each \LM.. command
7902 must occur on a separate line. \LMHash{} must occur immediately 7914 must occur on a separate line. \LMHash{} must occur immediately
7903 before the associated paragraph, and \LMLabel must occur immediately 7915 before the associated paragraph, and \LMLabel must occur immediately
7904 after the associated \section{}, \subsection{} etc. 7916 after the associated \section{}, \subsection{} etc.
7905 7917
7906 ---------------------------------------------------------------------- 7918 ----------------------------------------------------------------------
OLDNEW
« no previous file with comments | « no previous file | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698