Understanding LaTeX 2e's @esphack
I'm reading source2e.pdf and I have problems in understanding the sense of the definition of LaTeX 2ε's @esphack:
Commands like label{...} , which themselves do not/shall not produce any visible output, might in the source/in the .tex-input-file be surrounded by spaces. If so, you don't want two space-tokens as this would double the horizontal glue.
If I got it right, @bsphack and @esphack are there for avoiding the coming into being of a space-token after tokenizing and processing the command in case there already came one into being before tokenizing and processing the command.
So let's look at the definition of @bsphack:
> @bsphack=macro:
->relax ifhmode @savsk lastskip @savsf spacefactor fi .
l.1 show@bsphack
In words:
When in horizontal mode or in restricted horizontal mode, then save the value of lastskip to @savsk and save the value of spacefactor to @savsf.
Now let's look at the definition of @esphack:
> @esphack=macro:
->relax ifhmode spacefactor @savsf ifdim @savsk >z@ ifdim lastskip =z
@ nobreak hskip z@skip fi ignorespaces fi fi .
l.2 show@esphack
In words:
When in horizontal mode or in restricted horizontal mode, then:
- restore the value of
spacefactorto the value saved assavsf. - In case
@savskis larger than zero, i.e., in case there was some horizontal glue before carrying out the command which at its start called@bsphack, then doifdim lastskip =z@ nobreak hskip z@skip fi ignorespaces
.
I understand that ignorespaces will make sense as there was already some horizontal glue before carrying out the command which at its start called @bsphack.
But I don't understand what theifdim lastskip =z@ nobreak hskip z@skip fi
-part is good for.
What is the sense of this?
In the situation where this is carried out, the saved value in @savsk is larger than z@, thus one can conclude that something from within the command which at its start called @bsphack did change the value of lastskip to z@.
But doing something like nobreakhskipz@skip will not revert that change/will not restore lastskip to its previous value.
Thus: What is the gist/sense/benefit of performing that hskip of zero-width?
If you wish lastskip to be restored, shouldn't it then be something like:
def@esphack{%
relax
ifhmode
spacefactor@savsf
ifdim@savsk>z@
ifdimlastskip=z@
nobreak
hskip-@savsk
nobreak
hskip@savsk
% the total skip is zero and lastskip is restored.
fi
ignorespaces
fi
fi
}%
Or perhaps just
def@esphack{%
relax
ifhmode
spacefactor@savsf %now spacefactor is restored.
nobreak
hskip-@savsk
nobreak
hskip@savsk
% the total skip is zero and lastskip is restored.
ifdim@savsk>z@
ignorespaces
fi
fi
}%
Is it possible that in some previous release, it was done this way and in later releases somebody erroneously "optimized" the
nobreakhskip-@savsknobreakhskip@savsk to nobreakhskipz@skip, overlooking that this won't restore lastskip any more?
If I understand correctly, you need to restore lastskip correctly as otherwise things with consecutive sequences of @bsphack..@esphack, e.g., label{foo}label{bar} won't work correctly:
If by now you do something likeA label{foo} label{bar} A
orA label{foo}label{bar} A
, lastskip will in any case be 0 after label{foo} which affects the behavior of label{bar} because with label{bar} @savsk will not be larger than z@ any more so that ignorespaces won't get carried out although it should be carried out!
With the example below you can see a subtle difference when redefining @esphack so that it restores lastskip:
documentclass{article}
newsaveboxmybox
begin{document}
parnoindentbegin{lrbox}{mybox}
verb*|Alabel{1}B|:
end{lrbox}hbox to 4.5cm{useboxmyboxhfil} Alabel{1}B
parnoindentbegin{lrbox}{mybox}
verb*|A label{2} B|:
end{lrbox}hbox to 4.5cm{useboxmyboxhfil} A label{2} B
parnoindentbegin{lrbox}{mybox}
verb*|A label{3}label{4} B|:
end{lrbox}hbox to 4.5cm{useboxmyboxhfil} A label{3}label{4} B
parnoindentbegin{lrbox}{mybox}
verb*| label{5} label{6} B|:
end{lrbox}hbox to 4.5cm{useboxmyboxhfil} A label{5} label{6} B
makeatletter
def@esphack{%
relax
ifhmode
spacefactor@savsf
ifdim@savsk>z@
ifdimlastskip=z@
nobreak
hskip-@savsk
nobreak
hskip@savsk
% the total skip is zero and lastskip is restored.
fi
ignorespaces
fi
fi
}%
makeatother
noindentnullhrulefillnull
parnoindentbegin{lrbox}{mybox}
verb*|Alabel{a}B|:
end{lrbox}hbox to 4.5cm{useboxmyboxhfil} Alabel{a}B
parnoindentbegin{lrbox}{mybox}
verb*|A label{b} B|:
end{lrbox}hbox to 4.5cm{useboxmyboxhfil} A label{b} B
parnoindentbegin{lrbox}{mybox}
verb*|A label{c}label{d} B|:
end{lrbox}hbox to 4.5cm{useboxmyboxhfil} A label{c}label{d} B
parnoindentbegin{lrbox}{mybox}
verb*|A label{e} label{f} B|:
end{lrbox}hbox to 4.5cm{useboxmyboxhfil} A label{e} label{f} B
end{document}

Does my modification of @esphack have drawbacks?
Am I overlooking some caveat/something relevant?
spacing macros horizontal
New contributor
Questioner is a new contributor to this site. Take care in asking for clarification, commenting, and answering.
Check out our Code of Conduct.
add a comment |
I'm reading source2e.pdf and I have problems in understanding the sense of the definition of LaTeX 2ε's @esphack:
Commands like label{...} , which themselves do not/shall not produce any visible output, might in the source/in the .tex-input-file be surrounded by spaces. If so, you don't want two space-tokens as this would double the horizontal glue.
If I got it right, @bsphack and @esphack are there for avoiding the coming into being of a space-token after tokenizing and processing the command in case there already came one into being before tokenizing and processing the command.
So let's look at the definition of @bsphack:
> @bsphack=macro:
->relax ifhmode @savsk lastskip @savsf spacefactor fi .
l.1 show@bsphack
In words:
When in horizontal mode or in restricted horizontal mode, then save the value of lastskip to @savsk and save the value of spacefactor to @savsf.
Now let's look at the definition of @esphack:
> @esphack=macro:
->relax ifhmode spacefactor @savsf ifdim @savsk >z@ ifdim lastskip =z
@ nobreak hskip z@skip fi ignorespaces fi fi .
l.2 show@esphack
In words:
When in horizontal mode or in restricted horizontal mode, then:
- restore the value of
spacefactorto the value saved assavsf. - In case
@savskis larger than zero, i.e., in case there was some horizontal glue before carrying out the command which at its start called@bsphack, then doifdim lastskip =z@ nobreak hskip z@skip fi ignorespaces
.
I understand that ignorespaces will make sense as there was already some horizontal glue before carrying out the command which at its start called @bsphack.
But I don't understand what theifdim lastskip =z@ nobreak hskip z@skip fi
-part is good for.
What is the sense of this?
In the situation where this is carried out, the saved value in @savsk is larger than z@, thus one can conclude that something from within the command which at its start called @bsphack did change the value of lastskip to z@.
But doing something like nobreakhskipz@skip will not revert that change/will not restore lastskip to its previous value.
Thus: What is the gist/sense/benefit of performing that hskip of zero-width?
If you wish lastskip to be restored, shouldn't it then be something like:
def@esphack{%
relax
ifhmode
spacefactor@savsf
ifdim@savsk>z@
ifdimlastskip=z@
nobreak
hskip-@savsk
nobreak
hskip@savsk
% the total skip is zero and lastskip is restored.
fi
ignorespaces
fi
fi
}%
Or perhaps just
def@esphack{%
relax
ifhmode
spacefactor@savsf %now spacefactor is restored.
nobreak
hskip-@savsk
nobreak
hskip@savsk
% the total skip is zero and lastskip is restored.
ifdim@savsk>z@
ignorespaces
fi
fi
}%
Is it possible that in some previous release, it was done this way and in later releases somebody erroneously "optimized" the
nobreakhskip-@savsknobreakhskip@savsk to nobreakhskipz@skip, overlooking that this won't restore lastskip any more?
If I understand correctly, you need to restore lastskip correctly as otherwise things with consecutive sequences of @bsphack..@esphack, e.g., label{foo}label{bar} won't work correctly:
If by now you do something likeA label{foo} label{bar} A
orA label{foo}label{bar} A
, lastskip will in any case be 0 after label{foo} which affects the behavior of label{bar} because with label{bar} @savsk will not be larger than z@ any more so that ignorespaces won't get carried out although it should be carried out!
With the example below you can see a subtle difference when redefining @esphack so that it restores lastskip:
documentclass{article}
newsaveboxmybox
begin{document}
parnoindentbegin{lrbox}{mybox}
verb*|Alabel{1}B|:
end{lrbox}hbox to 4.5cm{useboxmyboxhfil} Alabel{1}B
parnoindentbegin{lrbox}{mybox}
verb*|A label{2} B|:
end{lrbox}hbox to 4.5cm{useboxmyboxhfil} A label{2} B
parnoindentbegin{lrbox}{mybox}
verb*|A label{3}label{4} B|:
end{lrbox}hbox to 4.5cm{useboxmyboxhfil} A label{3}label{4} B
parnoindentbegin{lrbox}{mybox}
verb*| label{5} label{6} B|:
end{lrbox}hbox to 4.5cm{useboxmyboxhfil} A label{5} label{6} B
makeatletter
def@esphack{%
relax
ifhmode
spacefactor@savsf
ifdim@savsk>z@
ifdimlastskip=z@
nobreak
hskip-@savsk
nobreak
hskip@savsk
% the total skip is zero and lastskip is restored.
fi
ignorespaces
fi
fi
}%
makeatother
noindentnullhrulefillnull
parnoindentbegin{lrbox}{mybox}
verb*|Alabel{a}B|:
end{lrbox}hbox to 4.5cm{useboxmyboxhfil} Alabel{a}B
parnoindentbegin{lrbox}{mybox}
verb*|A label{b} B|:
end{lrbox}hbox to 4.5cm{useboxmyboxhfil} A label{b} B
parnoindentbegin{lrbox}{mybox}
verb*|A label{c}label{d} B|:
end{lrbox}hbox to 4.5cm{useboxmyboxhfil} A label{c}label{d} B
parnoindentbegin{lrbox}{mybox}
verb*|A label{e} label{f} B|:
end{lrbox}hbox to 4.5cm{useboxmyboxhfil} A label{e} label{f} B
end{document}

Does my modification of @esphack have drawbacks?
Am I overlooking some caveat/something relevant?
spacing macros horizontal
New contributor
Questioner is a new contributor to this site. Take care in asking for clarification, commenting, and answering.
Check out our Code of Conduct.
add a comment |
I'm reading source2e.pdf and I have problems in understanding the sense of the definition of LaTeX 2ε's @esphack:
Commands like label{...} , which themselves do not/shall not produce any visible output, might in the source/in the .tex-input-file be surrounded by spaces. If so, you don't want two space-tokens as this would double the horizontal glue.
If I got it right, @bsphack and @esphack are there for avoiding the coming into being of a space-token after tokenizing and processing the command in case there already came one into being before tokenizing and processing the command.
So let's look at the definition of @bsphack:
> @bsphack=macro:
->relax ifhmode @savsk lastskip @savsf spacefactor fi .
l.1 show@bsphack
In words:
When in horizontal mode or in restricted horizontal mode, then save the value of lastskip to @savsk and save the value of spacefactor to @savsf.
Now let's look at the definition of @esphack:
> @esphack=macro:
->relax ifhmode spacefactor @savsf ifdim @savsk >z@ ifdim lastskip =z
@ nobreak hskip z@skip fi ignorespaces fi fi .
l.2 show@esphack
In words:
When in horizontal mode or in restricted horizontal mode, then:
- restore the value of
spacefactorto the value saved assavsf. - In case
@savskis larger than zero, i.e., in case there was some horizontal glue before carrying out the command which at its start called@bsphack, then doifdim lastskip =z@ nobreak hskip z@skip fi ignorespaces
.
I understand that ignorespaces will make sense as there was already some horizontal glue before carrying out the command which at its start called @bsphack.
But I don't understand what theifdim lastskip =z@ nobreak hskip z@skip fi
-part is good for.
What is the sense of this?
In the situation where this is carried out, the saved value in @savsk is larger than z@, thus one can conclude that something from within the command which at its start called @bsphack did change the value of lastskip to z@.
But doing something like nobreakhskipz@skip will not revert that change/will not restore lastskip to its previous value.
Thus: What is the gist/sense/benefit of performing that hskip of zero-width?
If you wish lastskip to be restored, shouldn't it then be something like:
def@esphack{%
relax
ifhmode
spacefactor@savsf
ifdim@savsk>z@
ifdimlastskip=z@
nobreak
hskip-@savsk
nobreak
hskip@savsk
% the total skip is zero and lastskip is restored.
fi
ignorespaces
fi
fi
}%
Or perhaps just
def@esphack{%
relax
ifhmode
spacefactor@savsf %now spacefactor is restored.
nobreak
hskip-@savsk
nobreak
hskip@savsk
% the total skip is zero and lastskip is restored.
ifdim@savsk>z@
ignorespaces
fi
fi
}%
Is it possible that in some previous release, it was done this way and in later releases somebody erroneously "optimized" the
nobreakhskip-@savsknobreakhskip@savsk to nobreakhskipz@skip, overlooking that this won't restore lastskip any more?
If I understand correctly, you need to restore lastskip correctly as otherwise things with consecutive sequences of @bsphack..@esphack, e.g., label{foo}label{bar} won't work correctly:
If by now you do something likeA label{foo} label{bar} A
orA label{foo}label{bar} A
, lastskip will in any case be 0 after label{foo} which affects the behavior of label{bar} because with label{bar} @savsk will not be larger than z@ any more so that ignorespaces won't get carried out although it should be carried out!
With the example below you can see a subtle difference when redefining @esphack so that it restores lastskip:
documentclass{article}
newsaveboxmybox
begin{document}
parnoindentbegin{lrbox}{mybox}
verb*|Alabel{1}B|:
end{lrbox}hbox to 4.5cm{useboxmyboxhfil} Alabel{1}B
parnoindentbegin{lrbox}{mybox}
verb*|A label{2} B|:
end{lrbox}hbox to 4.5cm{useboxmyboxhfil} A label{2} B
parnoindentbegin{lrbox}{mybox}
verb*|A label{3}label{4} B|:
end{lrbox}hbox to 4.5cm{useboxmyboxhfil} A label{3}label{4} B
parnoindentbegin{lrbox}{mybox}
verb*| label{5} label{6} B|:
end{lrbox}hbox to 4.5cm{useboxmyboxhfil} A label{5} label{6} B
makeatletter
def@esphack{%
relax
ifhmode
spacefactor@savsf
ifdim@savsk>z@
ifdimlastskip=z@
nobreak
hskip-@savsk
nobreak
hskip@savsk
% the total skip is zero and lastskip is restored.
fi
ignorespaces
fi
fi
}%
makeatother
noindentnullhrulefillnull
parnoindentbegin{lrbox}{mybox}
verb*|Alabel{a}B|:
end{lrbox}hbox to 4.5cm{useboxmyboxhfil} Alabel{a}B
parnoindentbegin{lrbox}{mybox}
verb*|A label{b} B|:
end{lrbox}hbox to 4.5cm{useboxmyboxhfil} A label{b} B
parnoindentbegin{lrbox}{mybox}
verb*|A label{c}label{d} B|:
end{lrbox}hbox to 4.5cm{useboxmyboxhfil} A label{c}label{d} B
parnoindentbegin{lrbox}{mybox}
verb*|A label{e} label{f} B|:
end{lrbox}hbox to 4.5cm{useboxmyboxhfil} A label{e} label{f} B
end{document}

Does my modification of @esphack have drawbacks?
Am I overlooking some caveat/something relevant?
spacing macros horizontal
New contributor
Questioner is a new contributor to this site. Take care in asking for clarification, commenting, and answering.
Check out our Code of Conduct.
I'm reading source2e.pdf and I have problems in understanding the sense of the definition of LaTeX 2ε's @esphack:
Commands like label{...} , which themselves do not/shall not produce any visible output, might in the source/in the .tex-input-file be surrounded by spaces. If so, you don't want two space-tokens as this would double the horizontal glue.
If I got it right, @bsphack and @esphack are there for avoiding the coming into being of a space-token after tokenizing and processing the command in case there already came one into being before tokenizing and processing the command.
So let's look at the definition of @bsphack:
> @bsphack=macro:
->relax ifhmode @savsk lastskip @savsf spacefactor fi .
l.1 show@bsphack
In words:
When in horizontal mode or in restricted horizontal mode, then save the value of lastskip to @savsk and save the value of spacefactor to @savsf.
Now let's look at the definition of @esphack:
> @esphack=macro:
->relax ifhmode spacefactor @savsf ifdim @savsk >z@ ifdim lastskip =z
@ nobreak hskip z@skip fi ignorespaces fi fi .
l.2 show@esphack
In words:
When in horizontal mode or in restricted horizontal mode, then:
- restore the value of
spacefactorto the value saved assavsf. - In case
@savskis larger than zero, i.e., in case there was some horizontal glue before carrying out the command which at its start called@bsphack, then doifdim lastskip =z@ nobreak hskip z@skip fi ignorespaces
.
I understand that ignorespaces will make sense as there was already some horizontal glue before carrying out the command which at its start called @bsphack.
But I don't understand what theifdim lastskip =z@ nobreak hskip z@skip fi
-part is good for.
What is the sense of this?
In the situation where this is carried out, the saved value in @savsk is larger than z@, thus one can conclude that something from within the command which at its start called @bsphack did change the value of lastskip to z@.
But doing something like nobreakhskipz@skip will not revert that change/will not restore lastskip to its previous value.
Thus: What is the gist/sense/benefit of performing that hskip of zero-width?
If you wish lastskip to be restored, shouldn't it then be something like:
def@esphack{%
relax
ifhmode
spacefactor@savsf
ifdim@savsk>z@
ifdimlastskip=z@
nobreak
hskip-@savsk
nobreak
hskip@savsk
% the total skip is zero and lastskip is restored.
fi
ignorespaces
fi
fi
}%
Or perhaps just
def@esphack{%
relax
ifhmode
spacefactor@savsf %now spacefactor is restored.
nobreak
hskip-@savsk
nobreak
hskip@savsk
% the total skip is zero and lastskip is restored.
ifdim@savsk>z@
ignorespaces
fi
fi
}%
Is it possible that in some previous release, it was done this way and in later releases somebody erroneously "optimized" the
nobreakhskip-@savsknobreakhskip@savsk to nobreakhskipz@skip, overlooking that this won't restore lastskip any more?
If I understand correctly, you need to restore lastskip correctly as otherwise things with consecutive sequences of @bsphack..@esphack, e.g., label{foo}label{bar} won't work correctly:
If by now you do something likeA label{foo} label{bar} A
orA label{foo}label{bar} A
, lastskip will in any case be 0 after label{foo} which affects the behavior of label{bar} because with label{bar} @savsk will not be larger than z@ any more so that ignorespaces won't get carried out although it should be carried out!
With the example below you can see a subtle difference when redefining @esphack so that it restores lastskip:
documentclass{article}
newsaveboxmybox
begin{document}
parnoindentbegin{lrbox}{mybox}
verb*|Alabel{1}B|:
end{lrbox}hbox to 4.5cm{useboxmyboxhfil} Alabel{1}B
parnoindentbegin{lrbox}{mybox}
verb*|A label{2} B|:
end{lrbox}hbox to 4.5cm{useboxmyboxhfil} A label{2} B
parnoindentbegin{lrbox}{mybox}
verb*|A label{3}label{4} B|:
end{lrbox}hbox to 4.5cm{useboxmyboxhfil} A label{3}label{4} B
parnoindentbegin{lrbox}{mybox}
verb*| label{5} label{6} B|:
end{lrbox}hbox to 4.5cm{useboxmyboxhfil} A label{5} label{6} B
makeatletter
def@esphack{%
relax
ifhmode
spacefactor@savsf
ifdim@savsk>z@
ifdimlastskip=z@
nobreak
hskip-@savsk
nobreak
hskip@savsk
% the total skip is zero and lastskip is restored.
fi
ignorespaces
fi
fi
}%
makeatother
noindentnullhrulefillnull
parnoindentbegin{lrbox}{mybox}
verb*|Alabel{a}B|:
end{lrbox}hbox to 4.5cm{useboxmyboxhfil} Alabel{a}B
parnoindentbegin{lrbox}{mybox}
verb*|A label{b} B|:
end{lrbox}hbox to 4.5cm{useboxmyboxhfil} A label{b} B
parnoindentbegin{lrbox}{mybox}
verb*|A label{c}label{d} B|:
end{lrbox}hbox to 4.5cm{useboxmyboxhfil} A label{c}label{d} B
parnoindentbegin{lrbox}{mybox}
verb*|A label{e} label{f} B|:
end{lrbox}hbox to 4.5cm{useboxmyboxhfil} A label{e} label{f} B
end{document}

Does my modification of @esphack have drawbacks?
Am I overlooking some caveat/something relevant?
spacing macros horizontal
spacing macros horizontal
New contributor
Questioner is a new contributor to this site. Take care in asking for clarification, commenting, and answering.
Check out our Code of Conduct.
New contributor
Questioner is a new contributor to this site. Take care in asking for clarification, commenting, and answering.
Check out our Code of Conduct.
edited 27 mins ago
Questioner
New contributor
Questioner is a new contributor to this site. Take care in asking for clarification, commenting, and answering.
Check out our Code of Conduct.
asked 1 hour ago
QuestionerQuestioner
63
63
New contributor
Questioner is a new contributor to this site. Take care in asking for clarification, commenting, and answering.
Check out our Code of Conduct.
New contributor
Questioner is a new contributor to this site. Take care in asking for clarification, commenting, and answering.
Check out our Code of Conduct.
Questioner is a new contributor to this site. Take care in asking for clarification, commenting, and answering.
Check out our Code of Conduct.
add a comment |
add a comment |
1 Answer
1
active
oldest
votes
You see more change comments, and older versions in the source:
% begin{macro}{@esphack}
% Companion to |@bsphack|. If this command is not properly paired
% with |@bsphack| one might end up with a low-level TeX{} error:
% ``BAD spacefactor''. One possible cause is calling |@bsphack| in
% vertical mode, then doing something that gets you (sometimes) into
% horizontal mode and finally calling |@esphack|. Even if no error
% is generated that is wrong, because |@esphack| will then use the
% saved values for |@savsk| and |@savsf| from some earlier
% invocation of |@bsphack| which will have nothing to do with the
% current situation.
% changes{v1.3d}{2015/01/11}{Allow hyphenation (Donald Arseneau pr/3498) (latexrelease)}
% begin{macrocode}
%</2ekernel>
%<latexrelease>IncludeInRelease{2018/10/10}%
%<latexrelease> {@esphack}{hyphenation and nobreak after space hack}%
%<*2ekernel|latexrelease>
def@esphack{%
relax
ifhmode
spacefactor@savsf
ifdim@savsk>z@
% end{macrocode}
% changes{v1.3f}{2015/11/07}
% {Only space if there is no space at the end of the hlist latex/4443}
% begin{macrocode}
ifdimlastskip=z@
nobreak hskipz@skip
fi
ignorespaces
fi
% end{macrocode}
% changes{v1.3i}{2018/10/10}
% {Don't introduce breakpoints if @nobreak is true and after sections}
% begin{macrocode}
else
ifvmode
if@nobreaknobreakelseif@noskipsecnobreakfifi
fi
% end{macrocode}
%
% begin{macrocode}
fi}%
%</2ekernel|latexrelease>
%<latexrelease>EndIncludeInRelease
%<latexrelease>IncludeInRelease{2015/10/01}%
%<latexrelease> {@esphack}{hyphenation and nobreak after space hack}%
%<latexrelease>def@esphack{%
%<latexrelease> relax
%<latexrelease> ifhmode
%<latexrelease> spacefactor@savsf
%<latexrelease> ifdim@savsk>z@
%<latexrelease> ifdimlastskip=z@
%<latexrelease> nobreak hskipz@skip
%<latexrelease> fi
%<latexrelease> ignorespaces
%<latexrelease> fi
%<latexrelease> fi}%
%<latexrelease>EndIncludeInRelease
%<latexrelease>IncludeInRelease{2015/01/01}%
%<latexrelease> {@esphack}{hyphenation and nobreak after space hack}%
%<latexrelease>def@esphack{%
%<latexrelease> relax
%<latexrelease> ifhmode
%<latexrelease> spacefactor@savsf
%<latexrelease> ifdim@savsk>z@
%<latexrelease> nobreak hskipz@skip
%<latexrelease> ignorespaces
%<latexrelease> fi
%<latexrelease> fi}%
%<latexrelease>EndIncludeInRelease
%<latexrelease>IncludeInRelease{0000/00/00}%
%<latexrelease> {@esphack}{hyphenation and nobreak after space hack}%
%<latexrelease>def@esphack{%
%<latexrelease> relax
%<latexrelease> ifhmode
%<latexrelease> spacefactor@savsf
%<latexrelease> ifdim@savsk>z@
%<latexrelease> ignorespaces
%<latexrelease> fi
%<latexrelease> fi}%
%<latexrelease>EndIncludeInRelease
%<*2ekernel>
% end{macrocode}
% end{macro}
Basically the bit you query, you need to add a space (or zero width) so as not to inhibit hyphenation, and then need to add the nobreak so the space doesn't introduce a breakpoint.
I just added another example to my question to make my point about consecutive commands that are wrapped into@bsphack..@esphackclearer.
– Questioner
44 mins ago
Thanks for your reply. I see. But wouldn't it be better to add that space (of zero width) in a way which also restoreslastskipso that one can have consecutive commands that don't produce visible output in a row? If by now you do something likeA label{foo} label{bar} B,lastskipwill in any case be 0 afterlabel{foo}which affects the behavior oflabel{bar}because withlabel{bar}@savskwill not be larger thanz@any more so thatignorespaceswon't get carried out although it should be carried out? Isnobreakhskip-@savsknobreakhskip@savskunsafe?
– Questioner
32 mins ago
To be honest: It is not clear to me what is meant by "not to inhibit hyphenation". Do people intend to place, e.g.,labelinto the middle of a word? If so: What is the insertion of (zero-width-)glue good for in the context of not inhibiting hyphenation?
– Questioner
16 mins ago
add a comment |
Your Answer
StackExchange.ready(function() {
var channelOptions = {
tags: "".split(" "),
id: "85"
};
initTagRenderer("".split(" "), "".split(" "), channelOptions);
StackExchange.using("externalEditor", function() {
// Have to fire editor after snippets, if snippets enabled
if (StackExchange.settings.snippets.snippetsEnabled) {
StackExchange.using("snippets", function() {
createEditor();
});
}
else {
createEditor();
}
});
function createEditor() {
StackExchange.prepareEditor({
heartbeatType: 'answer',
autoActivateHeartbeat: false,
convertImagesToLinks: false,
noModals: true,
showLowRepImageUploadWarning: true,
reputationToPostImages: null,
bindNavPrevention: true,
postfix: "",
imageUploader: {
brandingHtml: "Powered by u003ca class="icon-imgur-white" href="https://imgur.com/"u003eu003c/au003e",
contentPolicyHtml: "User contributions licensed under u003ca href="https://creativecommons.org/licenses/by-sa/3.0/"u003ecc by-sa 3.0 with attribution requiredu003c/au003e u003ca href="https://stackoverflow.com/legal/content-policy"u003e(content policy)u003c/au003e",
allowUrls: true
},
onDemand: true,
discardSelector: ".discard-answer"
,immediatelyShowMarkdownHelp:true
});
}
});
Questioner is a new contributor. Be nice, and check out our Code of Conduct.
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
StackExchange.ready(
function () {
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2ftex.stackexchange.com%2fquestions%2f481259%2funderstanding-latex-2es-esphack%23new-answer', 'question_page');
}
);
Post as a guest
Required, but never shown
1 Answer
1
active
oldest
votes
1 Answer
1
active
oldest
votes
active
oldest
votes
active
oldest
votes
You see more change comments, and older versions in the source:
% begin{macro}{@esphack}
% Companion to |@bsphack|. If this command is not properly paired
% with |@bsphack| one might end up with a low-level TeX{} error:
% ``BAD spacefactor''. One possible cause is calling |@bsphack| in
% vertical mode, then doing something that gets you (sometimes) into
% horizontal mode and finally calling |@esphack|. Even if no error
% is generated that is wrong, because |@esphack| will then use the
% saved values for |@savsk| and |@savsf| from some earlier
% invocation of |@bsphack| which will have nothing to do with the
% current situation.
% changes{v1.3d}{2015/01/11}{Allow hyphenation (Donald Arseneau pr/3498) (latexrelease)}
% begin{macrocode}
%</2ekernel>
%<latexrelease>IncludeInRelease{2018/10/10}%
%<latexrelease> {@esphack}{hyphenation and nobreak after space hack}%
%<*2ekernel|latexrelease>
def@esphack{%
relax
ifhmode
spacefactor@savsf
ifdim@savsk>z@
% end{macrocode}
% changes{v1.3f}{2015/11/07}
% {Only space if there is no space at the end of the hlist latex/4443}
% begin{macrocode}
ifdimlastskip=z@
nobreak hskipz@skip
fi
ignorespaces
fi
% end{macrocode}
% changes{v1.3i}{2018/10/10}
% {Don't introduce breakpoints if @nobreak is true and after sections}
% begin{macrocode}
else
ifvmode
if@nobreaknobreakelseif@noskipsecnobreakfifi
fi
% end{macrocode}
%
% begin{macrocode}
fi}%
%</2ekernel|latexrelease>
%<latexrelease>EndIncludeInRelease
%<latexrelease>IncludeInRelease{2015/10/01}%
%<latexrelease> {@esphack}{hyphenation and nobreak after space hack}%
%<latexrelease>def@esphack{%
%<latexrelease> relax
%<latexrelease> ifhmode
%<latexrelease> spacefactor@savsf
%<latexrelease> ifdim@savsk>z@
%<latexrelease> ifdimlastskip=z@
%<latexrelease> nobreak hskipz@skip
%<latexrelease> fi
%<latexrelease> ignorespaces
%<latexrelease> fi
%<latexrelease> fi}%
%<latexrelease>EndIncludeInRelease
%<latexrelease>IncludeInRelease{2015/01/01}%
%<latexrelease> {@esphack}{hyphenation and nobreak after space hack}%
%<latexrelease>def@esphack{%
%<latexrelease> relax
%<latexrelease> ifhmode
%<latexrelease> spacefactor@savsf
%<latexrelease> ifdim@savsk>z@
%<latexrelease> nobreak hskipz@skip
%<latexrelease> ignorespaces
%<latexrelease> fi
%<latexrelease> fi}%
%<latexrelease>EndIncludeInRelease
%<latexrelease>IncludeInRelease{0000/00/00}%
%<latexrelease> {@esphack}{hyphenation and nobreak after space hack}%
%<latexrelease>def@esphack{%
%<latexrelease> relax
%<latexrelease> ifhmode
%<latexrelease> spacefactor@savsf
%<latexrelease> ifdim@savsk>z@
%<latexrelease> ignorespaces
%<latexrelease> fi
%<latexrelease> fi}%
%<latexrelease>EndIncludeInRelease
%<*2ekernel>
% end{macrocode}
% end{macro}
Basically the bit you query, you need to add a space (or zero width) so as not to inhibit hyphenation, and then need to add the nobreak so the space doesn't introduce a breakpoint.
I just added another example to my question to make my point about consecutive commands that are wrapped into@bsphack..@esphackclearer.
– Questioner
44 mins ago
Thanks for your reply. I see. But wouldn't it be better to add that space (of zero width) in a way which also restoreslastskipso that one can have consecutive commands that don't produce visible output in a row? If by now you do something likeA label{foo} label{bar} B,lastskipwill in any case be 0 afterlabel{foo}which affects the behavior oflabel{bar}because withlabel{bar}@savskwill not be larger thanz@any more so thatignorespaceswon't get carried out although it should be carried out? Isnobreakhskip-@savsknobreakhskip@savskunsafe?
– Questioner
32 mins ago
To be honest: It is not clear to me what is meant by "not to inhibit hyphenation". Do people intend to place, e.g.,labelinto the middle of a word? If so: What is the insertion of (zero-width-)glue good for in the context of not inhibiting hyphenation?
– Questioner
16 mins ago
add a comment |
You see more change comments, and older versions in the source:
% begin{macro}{@esphack}
% Companion to |@bsphack|. If this command is not properly paired
% with |@bsphack| one might end up with a low-level TeX{} error:
% ``BAD spacefactor''. One possible cause is calling |@bsphack| in
% vertical mode, then doing something that gets you (sometimes) into
% horizontal mode and finally calling |@esphack|. Even if no error
% is generated that is wrong, because |@esphack| will then use the
% saved values for |@savsk| and |@savsf| from some earlier
% invocation of |@bsphack| which will have nothing to do with the
% current situation.
% changes{v1.3d}{2015/01/11}{Allow hyphenation (Donald Arseneau pr/3498) (latexrelease)}
% begin{macrocode}
%</2ekernel>
%<latexrelease>IncludeInRelease{2018/10/10}%
%<latexrelease> {@esphack}{hyphenation and nobreak after space hack}%
%<*2ekernel|latexrelease>
def@esphack{%
relax
ifhmode
spacefactor@savsf
ifdim@savsk>z@
% end{macrocode}
% changes{v1.3f}{2015/11/07}
% {Only space if there is no space at the end of the hlist latex/4443}
% begin{macrocode}
ifdimlastskip=z@
nobreak hskipz@skip
fi
ignorespaces
fi
% end{macrocode}
% changes{v1.3i}{2018/10/10}
% {Don't introduce breakpoints if @nobreak is true and after sections}
% begin{macrocode}
else
ifvmode
if@nobreaknobreakelseif@noskipsecnobreakfifi
fi
% end{macrocode}
%
% begin{macrocode}
fi}%
%</2ekernel|latexrelease>
%<latexrelease>EndIncludeInRelease
%<latexrelease>IncludeInRelease{2015/10/01}%
%<latexrelease> {@esphack}{hyphenation and nobreak after space hack}%
%<latexrelease>def@esphack{%
%<latexrelease> relax
%<latexrelease> ifhmode
%<latexrelease> spacefactor@savsf
%<latexrelease> ifdim@savsk>z@
%<latexrelease> ifdimlastskip=z@
%<latexrelease> nobreak hskipz@skip
%<latexrelease> fi
%<latexrelease> ignorespaces
%<latexrelease> fi
%<latexrelease> fi}%
%<latexrelease>EndIncludeInRelease
%<latexrelease>IncludeInRelease{2015/01/01}%
%<latexrelease> {@esphack}{hyphenation and nobreak after space hack}%
%<latexrelease>def@esphack{%
%<latexrelease> relax
%<latexrelease> ifhmode
%<latexrelease> spacefactor@savsf
%<latexrelease> ifdim@savsk>z@
%<latexrelease> nobreak hskipz@skip
%<latexrelease> ignorespaces
%<latexrelease> fi
%<latexrelease> fi}%
%<latexrelease>EndIncludeInRelease
%<latexrelease>IncludeInRelease{0000/00/00}%
%<latexrelease> {@esphack}{hyphenation and nobreak after space hack}%
%<latexrelease>def@esphack{%
%<latexrelease> relax
%<latexrelease> ifhmode
%<latexrelease> spacefactor@savsf
%<latexrelease> ifdim@savsk>z@
%<latexrelease> ignorespaces
%<latexrelease> fi
%<latexrelease> fi}%
%<latexrelease>EndIncludeInRelease
%<*2ekernel>
% end{macrocode}
% end{macro}
Basically the bit you query, you need to add a space (or zero width) so as not to inhibit hyphenation, and then need to add the nobreak so the space doesn't introduce a breakpoint.
I just added another example to my question to make my point about consecutive commands that are wrapped into@bsphack..@esphackclearer.
– Questioner
44 mins ago
Thanks for your reply. I see. But wouldn't it be better to add that space (of zero width) in a way which also restoreslastskipso that one can have consecutive commands that don't produce visible output in a row? If by now you do something likeA label{foo} label{bar} B,lastskipwill in any case be 0 afterlabel{foo}which affects the behavior oflabel{bar}because withlabel{bar}@savskwill not be larger thanz@any more so thatignorespaceswon't get carried out although it should be carried out? Isnobreakhskip-@savsknobreakhskip@savskunsafe?
– Questioner
32 mins ago
To be honest: It is not clear to me what is meant by "not to inhibit hyphenation". Do people intend to place, e.g.,labelinto the middle of a word? If so: What is the insertion of (zero-width-)glue good for in the context of not inhibiting hyphenation?
– Questioner
16 mins ago
add a comment |
You see more change comments, and older versions in the source:
% begin{macro}{@esphack}
% Companion to |@bsphack|. If this command is not properly paired
% with |@bsphack| one might end up with a low-level TeX{} error:
% ``BAD spacefactor''. One possible cause is calling |@bsphack| in
% vertical mode, then doing something that gets you (sometimes) into
% horizontal mode and finally calling |@esphack|. Even if no error
% is generated that is wrong, because |@esphack| will then use the
% saved values for |@savsk| and |@savsf| from some earlier
% invocation of |@bsphack| which will have nothing to do with the
% current situation.
% changes{v1.3d}{2015/01/11}{Allow hyphenation (Donald Arseneau pr/3498) (latexrelease)}
% begin{macrocode}
%</2ekernel>
%<latexrelease>IncludeInRelease{2018/10/10}%
%<latexrelease> {@esphack}{hyphenation and nobreak after space hack}%
%<*2ekernel|latexrelease>
def@esphack{%
relax
ifhmode
spacefactor@savsf
ifdim@savsk>z@
% end{macrocode}
% changes{v1.3f}{2015/11/07}
% {Only space if there is no space at the end of the hlist latex/4443}
% begin{macrocode}
ifdimlastskip=z@
nobreak hskipz@skip
fi
ignorespaces
fi
% end{macrocode}
% changes{v1.3i}{2018/10/10}
% {Don't introduce breakpoints if @nobreak is true and after sections}
% begin{macrocode}
else
ifvmode
if@nobreaknobreakelseif@noskipsecnobreakfifi
fi
% end{macrocode}
%
% begin{macrocode}
fi}%
%</2ekernel|latexrelease>
%<latexrelease>EndIncludeInRelease
%<latexrelease>IncludeInRelease{2015/10/01}%
%<latexrelease> {@esphack}{hyphenation and nobreak after space hack}%
%<latexrelease>def@esphack{%
%<latexrelease> relax
%<latexrelease> ifhmode
%<latexrelease> spacefactor@savsf
%<latexrelease> ifdim@savsk>z@
%<latexrelease> ifdimlastskip=z@
%<latexrelease> nobreak hskipz@skip
%<latexrelease> fi
%<latexrelease> ignorespaces
%<latexrelease> fi
%<latexrelease> fi}%
%<latexrelease>EndIncludeInRelease
%<latexrelease>IncludeInRelease{2015/01/01}%
%<latexrelease> {@esphack}{hyphenation and nobreak after space hack}%
%<latexrelease>def@esphack{%
%<latexrelease> relax
%<latexrelease> ifhmode
%<latexrelease> spacefactor@savsf
%<latexrelease> ifdim@savsk>z@
%<latexrelease> nobreak hskipz@skip
%<latexrelease> ignorespaces
%<latexrelease> fi
%<latexrelease> fi}%
%<latexrelease>EndIncludeInRelease
%<latexrelease>IncludeInRelease{0000/00/00}%
%<latexrelease> {@esphack}{hyphenation and nobreak after space hack}%
%<latexrelease>def@esphack{%
%<latexrelease> relax
%<latexrelease> ifhmode
%<latexrelease> spacefactor@savsf
%<latexrelease> ifdim@savsk>z@
%<latexrelease> ignorespaces
%<latexrelease> fi
%<latexrelease> fi}%
%<latexrelease>EndIncludeInRelease
%<*2ekernel>
% end{macrocode}
% end{macro}
Basically the bit you query, you need to add a space (or zero width) so as not to inhibit hyphenation, and then need to add the nobreak so the space doesn't introduce a breakpoint.
You see more change comments, and older versions in the source:
% begin{macro}{@esphack}
% Companion to |@bsphack|. If this command is not properly paired
% with |@bsphack| one might end up with a low-level TeX{} error:
% ``BAD spacefactor''. One possible cause is calling |@bsphack| in
% vertical mode, then doing something that gets you (sometimes) into
% horizontal mode and finally calling |@esphack|. Even if no error
% is generated that is wrong, because |@esphack| will then use the
% saved values for |@savsk| and |@savsf| from some earlier
% invocation of |@bsphack| which will have nothing to do with the
% current situation.
% changes{v1.3d}{2015/01/11}{Allow hyphenation (Donald Arseneau pr/3498) (latexrelease)}
% begin{macrocode}
%</2ekernel>
%<latexrelease>IncludeInRelease{2018/10/10}%
%<latexrelease> {@esphack}{hyphenation and nobreak after space hack}%
%<*2ekernel|latexrelease>
def@esphack{%
relax
ifhmode
spacefactor@savsf
ifdim@savsk>z@
% end{macrocode}
% changes{v1.3f}{2015/11/07}
% {Only space if there is no space at the end of the hlist latex/4443}
% begin{macrocode}
ifdimlastskip=z@
nobreak hskipz@skip
fi
ignorespaces
fi
% end{macrocode}
% changes{v1.3i}{2018/10/10}
% {Don't introduce breakpoints if @nobreak is true and after sections}
% begin{macrocode}
else
ifvmode
if@nobreaknobreakelseif@noskipsecnobreakfifi
fi
% end{macrocode}
%
% begin{macrocode}
fi}%
%</2ekernel|latexrelease>
%<latexrelease>EndIncludeInRelease
%<latexrelease>IncludeInRelease{2015/10/01}%
%<latexrelease> {@esphack}{hyphenation and nobreak after space hack}%
%<latexrelease>def@esphack{%
%<latexrelease> relax
%<latexrelease> ifhmode
%<latexrelease> spacefactor@savsf
%<latexrelease> ifdim@savsk>z@
%<latexrelease> ifdimlastskip=z@
%<latexrelease> nobreak hskipz@skip
%<latexrelease> fi
%<latexrelease> ignorespaces
%<latexrelease> fi
%<latexrelease> fi}%
%<latexrelease>EndIncludeInRelease
%<latexrelease>IncludeInRelease{2015/01/01}%
%<latexrelease> {@esphack}{hyphenation and nobreak after space hack}%
%<latexrelease>def@esphack{%
%<latexrelease> relax
%<latexrelease> ifhmode
%<latexrelease> spacefactor@savsf
%<latexrelease> ifdim@savsk>z@
%<latexrelease> nobreak hskipz@skip
%<latexrelease> ignorespaces
%<latexrelease> fi
%<latexrelease> fi}%
%<latexrelease>EndIncludeInRelease
%<latexrelease>IncludeInRelease{0000/00/00}%
%<latexrelease> {@esphack}{hyphenation and nobreak after space hack}%
%<latexrelease>def@esphack{%
%<latexrelease> relax
%<latexrelease> ifhmode
%<latexrelease> spacefactor@savsf
%<latexrelease> ifdim@savsk>z@
%<latexrelease> ignorespaces
%<latexrelease> fi
%<latexrelease> fi}%
%<latexrelease>EndIncludeInRelease
%<*2ekernel>
% end{macrocode}
% end{macro}
Basically the bit you query, you need to add a space (or zero width) so as not to inhibit hyphenation, and then need to add the nobreak so the space doesn't introduce a breakpoint.
answered 1 hour ago
David CarlisleDavid Carlisle
495k4111411889
495k4111411889
I just added another example to my question to make my point about consecutive commands that are wrapped into@bsphack..@esphackclearer.
– Questioner
44 mins ago
Thanks for your reply. I see. But wouldn't it be better to add that space (of zero width) in a way which also restoreslastskipso that one can have consecutive commands that don't produce visible output in a row? If by now you do something likeA label{foo} label{bar} B,lastskipwill in any case be 0 afterlabel{foo}which affects the behavior oflabel{bar}because withlabel{bar}@savskwill not be larger thanz@any more so thatignorespaceswon't get carried out although it should be carried out? Isnobreakhskip-@savsknobreakhskip@savskunsafe?
– Questioner
32 mins ago
To be honest: It is not clear to me what is meant by "not to inhibit hyphenation". Do people intend to place, e.g.,labelinto the middle of a word? If so: What is the insertion of (zero-width-)glue good for in the context of not inhibiting hyphenation?
– Questioner
16 mins ago
add a comment |
I just added another example to my question to make my point about consecutive commands that are wrapped into@bsphack..@esphackclearer.
– Questioner
44 mins ago
Thanks for your reply. I see. But wouldn't it be better to add that space (of zero width) in a way which also restoreslastskipso that one can have consecutive commands that don't produce visible output in a row? If by now you do something likeA label{foo} label{bar} B,lastskipwill in any case be 0 afterlabel{foo}which affects the behavior oflabel{bar}because withlabel{bar}@savskwill not be larger thanz@any more so thatignorespaceswon't get carried out although it should be carried out? Isnobreakhskip-@savsknobreakhskip@savskunsafe?
– Questioner
32 mins ago
To be honest: It is not clear to me what is meant by "not to inhibit hyphenation". Do people intend to place, e.g.,labelinto the middle of a word? If so: What is the insertion of (zero-width-)glue good for in the context of not inhibiting hyphenation?
– Questioner
16 mins ago
I just added another example to my question to make my point about consecutive commands that are wrapped into
@bsphack..@esphack clearer.– Questioner
44 mins ago
I just added another example to my question to make my point about consecutive commands that are wrapped into
@bsphack..@esphack clearer.– Questioner
44 mins ago
Thanks for your reply. I see. But wouldn't it be better to add that space (of zero width) in a way which also restores
lastskip so that one can have consecutive commands that don't produce visible output in a row? If by now you do something like A label{foo} label{bar} B , lastskip will in any case be 0 after label{foo} which affects the behavior of label{bar} because with label{bar} @savsk will not be larger than z@ any more so that ignorespaces won't get carried out although it should be carried out? Is nobreakhskip-@savsknobreakhskip@savsk unsafe?– Questioner
32 mins ago
Thanks for your reply. I see. But wouldn't it be better to add that space (of zero width) in a way which also restores
lastskip so that one can have consecutive commands that don't produce visible output in a row? If by now you do something like A label{foo} label{bar} B , lastskip will in any case be 0 after label{foo} which affects the behavior of label{bar} because with label{bar} @savsk will not be larger than z@ any more so that ignorespaces won't get carried out although it should be carried out? Is nobreakhskip-@savsknobreakhskip@savsk unsafe?– Questioner
32 mins ago
To be honest: It is not clear to me what is meant by "not to inhibit hyphenation". Do people intend to place, e.g.,
label into the middle of a word? If so: What is the insertion of (zero-width-)glue good for in the context of not inhibiting hyphenation?– Questioner
16 mins ago
To be honest: It is not clear to me what is meant by "not to inhibit hyphenation". Do people intend to place, e.g.,
label into the middle of a word? If so: What is the insertion of (zero-width-)glue good for in the context of not inhibiting hyphenation?– Questioner
16 mins ago
add a comment |
Questioner is a new contributor. Be nice, and check out our Code of Conduct.
Questioner is a new contributor. Be nice, and check out our Code of Conduct.
Questioner is a new contributor. Be nice, and check out our Code of Conduct.
Questioner is a new contributor. Be nice, and check out our Code of Conduct.
Thanks for contributing an answer to TeX - LaTeX Stack Exchange!
- Please be sure to answer the question. Provide details and share your research!
But avoid …
- Asking for help, clarification, or responding to other answers.
- Making statements based on opinion; back them up with references or personal experience.
To learn more, see our tips on writing great answers.
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
StackExchange.ready(
function () {
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2ftex.stackexchange.com%2fquestions%2f481259%2funderstanding-latex-2es-esphack%23new-answer', 'question_page');
}
);
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown