summaryrefslogtreecommitdiff
path: root/macros/latex/contrib/easyformat/easyformat.sty
diff options
context:
space:
mode:
authorNorbert Preining <norbert@preining.info>2019-09-02 13:46:59 +0900
committerNorbert Preining <norbert@preining.info>2019-09-02 13:46:59 +0900
commite0c6872cf40896c7be36b11dcc744620f10adf1d (patch)
tree60335e10d2f4354b0674ec22d7b53f0f8abee672 /macros/latex/contrib/easyformat/easyformat.sty
Initial commit
Diffstat (limited to 'macros/latex/contrib/easyformat/easyformat.sty')
-rw-r--r--macros/latex/contrib/easyformat/easyformat.sty186
1 files changed, 186 insertions, 0 deletions
diff --git a/macros/latex/contrib/easyformat/easyformat.sty b/macros/latex/contrib/easyformat/easyformat.sty
new file mode 100644
index 0000000000..9b8bc4424d
--- /dev/null
+++ b/macros/latex/contrib/easyformat/easyformat.sty
@@ -0,0 +1,186 @@
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% %
+% easyformat Easily add boldface, italics and smallcaps in LaTeX. %
+% Copyright (C) 2017 Evert Provoost <evert.provoost@gmail.com> %
+% %
+% This program is free software: you can redistribute it and/or modify %
+% it under the terms of the GNU General Public License as published by %
+% the Free Software Foundation, either version 3 of the License, or %
+% (at your option) any later version. %
+% %
+% This program is distributed in the hope that it will be useful, %
+% but WITHOUT ANY WARRANTY; without even the implied warranty of %
+% MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the %
+% GNU General Public License for more details. %
+% %
+% You should have received a copy of the GNU General Public License %
+% along with this program. If not, see <http://www.gnu.org/licenses/>. %
+% %
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+
+%% NOTE TO THE FUTURE:
+% In LaTeX3 the `New Font Selection Scheme' is replaced
+% by XFSS (xfont). Moving will require some research.
+
+
+%% Administration...
+\RequirePackage{expl3}[2016/04/21]
+\ProvidesExplPackage
+ {easyformat}
+ {2017/06/03}
+ {1.4.0}
+ {Easily add boldface, italics and smallcaps.}
+
+
+%% Public macros
+% Add macros to switch the syntax on or off.
+\cs_new:Npn \enableeasyformat
+ {
+ \char_set_catcode_active:N _
+ \char_set_catcode_active:N ^
+ }
+
+\cs_new:Npn \disableeasyformat
+ {
+ \char_set_catcode_math_subscript:N _
+ \char_set_catcode_math_superscript:N ^
+ }
+
+% Add a macro LaTeX should have...
+% Which is protected to fix the double superscript error
+% and able to give correct kerning in mathmode.
+\cs_new_protected:Npn \cir
+ {
+ \mode_if_math:TF
+ { \hat{} }
+ { \c_circumflex_str }
+ }
+
+
+%% Variables
+% Remember the style before changing to italics/boldface/smallcaps.
+\str_new:N \l__prev_shape_str
+\str_set_eq:NN \l__prev_shape_str \shapedefault
+
+\str_new:N \l__prev_case_str
+% Case is the option used in XFSS, however do note that in
+% LaTeX2e's NFSS, smallcaps is a kind of shape.
+\str_set_eq:NN \l__prev_case_str \shapedefault
+
+\str_new:N \l__prev_series_str
+\str_set_eq:NN \l__prev_series_str \seriesdefault
+
+
+%% Formating handling
+% Add macros which change the font shape and font series.
+\cs_new:Npn \__font_set_shape:n #1
+ {
+ \fontshape {#1}
+ \selectfont
+ }
+
+\cs_new:Npn \__font_set_series:n #1
+ {
+ \fontseries {#1}
+ \selectfont
+ }
+
+% Switch italics on or off.
+\cs_new:Npn \__handle_italics:
+ {
+ \str_if_eq:NNTF \f@shape \itdefault
+ {
+ \__font_set_shape:n {\l__prev_shape_str}
+ \str_set_eq:NN \l__prev_shape_str \shapedefault
+ % \maybe@ic adds italics correction if needed.
+ % Probably becomes \xfss_maybe_ic: in LaTeX3.
+ \maybe@ic
+ }
+ {
+ \str_set_eq:NN \l__prev_shape_str \f@shape
+ \itshape
+ }
+ }
+
+% Switch smallcaps on or off.
+\cs_new:Npn \__handle_smallcaps:
+ {
+ \str_if_eq:NNTF \f@shape \scdefault
+ {
+ \__font_set_shape:n {\l__prev_case_str}
+ \str_set_eq:NN \l__prev_case_str \shapedefault
+ }
+ {
+ \str_set_eq:NN \l__prev_case_str \f@shape
+ \scshape
+ }
+ }
+
+% Switch boldface on or off.
+\cs_new:Npn \__handle_boldface:
+ {
+ \str_if_eq:NNTF \f@series \bfdefault
+ {
+ \__font_set_series:n {\l__prev_series_str}
+ \str_set_eq:NN \l__prev_series_str \seriesdefault
+ }
+ {
+ \str_set_eq:NN \l__prev_series_str \f@series
+ \bfseries
+ }
+ }
+
+
+%% Handling the syntax
+% This is where the magic happens (also differentiates between
+% text- and mathmode.)
+% These are protected because they should also work in eg. \section{}
+
+% Syntax handling for the underscore: italics and boldface.
+\cs_new_protected:Npn \__syntax_underscore:
+ {
+ \mode_if_math:TF
+ { \c_math_subscript_token }
+ {
+ \peek_charcode_remove:NTF _
+ % The second underscore is removed when detected.
+ { \__handle_boldface: }
+ { \__handle_italics: }
+ }
+ }
+
+% Syntax handling for the circumflex: smallcaps.
+\cs_new_protected:Npn \__syntax_circumflex:
+ {
+ \mode_if_math:TF
+ { \c_math_superscript_token }
+ { \__handle_smallcaps: }
+ }
+
+% Now give the underscore and the circumflex their behaviour.
+\char_set_active_eq:NN _ \__syntax_underscore:
+\char_set_active_eq:NN ^ \__syntax_circumflex:
+
+
+%% Activate the systems.
+% First disable the Expl3 syntax as it will only cause trouble.
+\ExplSyntaxOff
+
+% Now enable the easyformat syntax.
+\enableeasyformat
+
+% DONE!!!
+
+
+%% IMPLEMENTATION DETAILS:
+%% Why not \textit/bf/sc\bgroup and \egroup?
+% Well actualy that was the original solution. However this
+% doesn't differentiate between ending itallics or ending
+% boldface. The current solution does and this makes the
+% syntax more predictable and generally more useful.
+
+%% Why no ^^typewriter^^?
+% because this doesn't add much value, in most contexts
+% where a monospace font is useful there is already
+% other syntax available.