%% %% This is file `codebox.sty', %% generated with the docstrip utility. %% %% The original source files were: %% %% codebox.dtx (with options: `package') %% %% Copyright (C) 2020-2022 by Nan Geng %% -------------------------------------------------------------------------- %% %% This work may be distributed and/or modified under the %% conditions of the LaTeX Project Public License, either %% version 1.3c of this license or (at your option) any later %% version. This version of this license is in %% http://www.latex-project.org/lppl/lppl-1-3c.txt %% and the latest version of this license is in %% http://www.latex-project.org/lppl.txt %% and version 1.3 or later is part of all distributions of %% LaTeX version 2005/12/01 or later. %% %% This work has the LPPL maintenance status "maintained". %% %% The Current Maintainer of this work is Nan Geng. %% %% -------------------------------------------------------------------------- %% \NeedsTeXFormat{LaTeX2e}[2020/10/01] \RequirePackage{expl3} \GetIdInfo$Id: codebox.dtx 1.0.4 2022-01-28 08:00:00 +0800 Nan Geng $ {Code Box with tcolorbox and minted/listings.} \ProvidesExplPackage{\ExplFileName} {\ExplFileDate}{\ExplFileVersion}{\ExplFileDescription} \RequirePackage { xtemplate, l3keys2e, xparse } \RequirePackage {fontawesome5, tcolorbox, varwidth, xcolor, etoolbox} \ExplSyntaxOff \patchcmd {\tcb@input@library@in} {% \input\tcbpkgprefix#1\relax% } {% \@pushfilename \input\tcbpkgprefix#1\relax% \@popfilename } {}{} \patchcmd {\pgfutil@InputIfFileExists} {\input #1} {% \@pushfilename \xdef\@currname{#1}% \input #1 % \@popfilename } {}{} \ExplSyntaxOn \tcbuselibrary{skins, xparse, breakable} \tcbuselibrary{minted,listings} \usetikzlibrary{shapes.geometric} \definecolor{cvgrayc}{RGB}{247,247,247} \definecolor{cvgray}{RGB}{220,220,220} \definecolor{cvgrayb}{RGB}{153,153,153} \definecolor{cvblue}{RGB}{223,238,255} \definecolor{chengse}{RGB}{250,140,53} \tcbset{% skin=enhanced, lang/.style={% breakable,% drop~shadow,% colframe=gray!75!black,% left=4.5mm, enhanced,% colframe=tcbcolback!60!black,% colback=white,% colbacktitle=tcbcolback!5!gray!10!white,% fonttitle=\bfseries,% coltitle=black,% attach~boxed~title~to~top~center={% yshift=-0.25mm-\tcboxedtitleheight/2,% yshifttext=2mm-\tcboxedtitleheight/2% },% attach~boxed~title~to~top~left={% xshift=1cm,% yshift*=1mm-\tcboxedtitleheight% },% varwidth~boxed~title*=-3cm,% boxed~title~style={% frame~code={% \path[fill=tcbcolback!30!black]([yshift=-1mm,xshift=-1mm]frame.north~west)% arc[start~angle=0,end~angle=180,radius=1mm]([yshift=-1mm,xshift=1mm]frame.north~east)% arc[start~angle=180,end~angle=0,radius=1mm];% \path[left~color=tcbcolback!60!black,right~color=tcbcolback!60!black, middle~color=tcbcolback!80!black]([xshift=-2mm]frame.north~west)% --([xshift=2mm]frame.north~east)[rounded~corners=1mm]% --([xshift=1mm,yshift=-1mm]frame.north~east)% --(frame.south~east)% --(frame.south~west)% --([xshift=-1mm,yshift=-1mm]frame.north~west)[sharp~corners]% --cycle;% },% interior~engine=empty% },% overlay={% \begin{tcbclipinterior} \fill[tcbcolback!80!black] (frame.south~west) rectangle ([xshift=5mm]frame.north~west); \end{tcbclipinterior}% }, }% }% \tcbset{% skin=enhanced, cv/.style={ boxrule=0.4mm, breakable, top=0mm, boxsep=1mm, drop~shadow, attach~boxed~title~to~top, colframe=blue!75!black, left=4.5mm, right=0mm, enhanced, colframe=tcbcolback!60!black, colback=white, colbacktitle=cvgray, fonttitle=\ttfamily, coltitle=black, underlay~boxed~title = { \begin{tcbclipinterior} \fill[cvblue] (frame.south~west) rectangle ([xshift=5.0mm,yshift=0mm]frame.north~west); \end{tcbclipinterior} }, underlay~middle = { \begin{tcbclipinterior} \fill[cvblue] (frame.south~west) rectangle ([xshift=5.0mm,yshift=0mm]frame.north~west); \end{tcbclipinterior} }, underlay~last = { \begin{tcbclipinterior} \fill[cvblue] (frame.south~west) rectangle ([xshift=5.0mm,yshift=0mm]frame.north~west); \end{tcbclipinterior} }, } }% \bool_new:N \l__codebox_minted_bool \bool_new:N \l__codebox_comment_bool \tl_new:N \l__codebox_language_tl \tl_new:N \l__codebox_code_style_tl \tl_new:N \l__codebox_code_fontsize_tl \tl_new:N \l__codebox_code_name_tl \tl_new:N \l__codebox_comment_contents_tl \tl_new:N \l__codebox_comment_format_tl \tl_new:N \l__codebox_label_name_tl \fp_new:N \l__codebox_baseline_stretch_fp \fp_new:N \l__codebox_linenumber_sep_fp \keys_define:nn { codebox } { minted .bool_set:N = \l__codebox_minted_bool, minted .default:n = true, minted .initial:n = true, lang .tl_set:N = \l__codebox_language_tl, lang .initial:n = c, pretitle .tl_set:N = \l__codebox_code_name_tl, pretitle .initial:n = Code, codestyle .tl_set:N = \l__codebox_code_style_tl, codestyle .initial:n = default, codesize .tl_set:N = \l__codebox_code_fontsize_tl, codesize .initial:n = \small, comments .tl_set:N = \l__codebox_comment_contents_tl, comments .initial:n = {}, commentf .tl_set:N = \l__codebox_comment_format_tl, commentf .initial:n = \small\sffamily, codestretch .code:n = { \fp_set:Nn \l__codebox_baseline_stretch_fp { #1 } }, codestretch .initial:n = 1.0, linenumsep .fp_set:N = \l__codebox_linenumber_sep_fp, linenumsep .initial:n = 1.80, label .tl_set:N = \l__codebox_label_name_tl, label .initial:n = {}, unknown .code:n = { \__codebox_error:n { unknown-option } } } \msg_new:nnn { codebox } { unknown-option } { package~ option~ "\l_keys_key_tl"~ is~ unknown. } \NewDocumentCommand \codeset { m } { \keys_set:nn { codebox } {#1} } \cs_new:Npn \__codebox_set_counter_parent: { \ifdef{\thechapter} { \newcounter{cvcounter}[chapter]% \renewcommand{\thecvcounter}{\thechapter.\arabic{cvcounter}} }{ \newcounter{cvcounter}%[section]% } } \cs_new:Npn \__codebox_minted_engine_tcbset:n #1 { \tcbset{ listing~engine=minted,% minted~style=#1, minted~options={% autogobble, breaklines,% fontsize=\tl_use:N \l__codebox_code_fontsize_tl,% baselinestretch=\fp_eval:n { \l__codebox_baseline_stretch_fp }, breaksymbolleft={},% linenos,% numbersep=\fp_eval:n { \l__codebox_linenumber_sep_fp }~mm, },% minted~language=\tl_use:N \l__codebox_language_tl% } } \cs_generate_variant:Nn \__codebox_minted_engine_tcbset:n {V} \cs_new:Npn \__codebox_listings_engine_tcbset: { \lstset{% general command to set parameter(s) basicstyle=\ttfamily\tl_use:N \l__codebox_code_fontsize_tl, % print whole listing small keywordstyle=\color{chengse}\bfseries,% identifierstyle=, % nothing happens breaklines=true, commentstyle=\itshape\color{gray}, stringstyle=\ttfamily, % typewriter type for strings numbers=left,% numberstyle=\tl_use:N \l__codebox_code_fontsize_tl\sffamily\color[rgb]{0.5,0.5,1.0},% }% \tcbset{ overlay={% \begin{tcbclipinterior} \fill[tcbcolback!80!black] (frame.south~west) rectangle ([xshift=5mm]frame.north~west); \end{tcbclipinterior}% },% listing~options={ language=\tl_use:N \l__codebox_language_tl, numbersep=\fp_eval:n { \l__codebox_linenumber_sep_fp }~mm, %linebackgroundcolor={\ifodd\value{lstnumber}\color{cvgray}\fi} } }% } \cs_new:Npn \__codebox_code_engine_tcbset: { \bool_if:NTF \l__codebox_minted_bool { \__codebox_minted_engine_tcbset:V \l__codebox_code_style_tl }{ \__codebox_listings_engine_tcbset: } } \cs_new:Npn \__codebox_comment_tcbset: { \bool_if:NTF { \l__codebox_comment_bool } { \tcbset{% listing~and~comment,% colbacklower=tcbcolback!5!yellow!10!white,% collower=tcbcolback!60!black,% comment={\tl_use:N \l__codebox_comment_format_tl~ \tl_use:N \l__codebox_comment_contents_tl},% } }{ \tcbset{ listing~only,} } } \NewDocumentEnvironment{ codebox }{O{} m } { \group_begin: \bool_set_false:N \l__codebox_comment_bool \keys_set:nn { codebox } { #1 } \__codebox_code_engine_tcbset: \__codebox_comment_tcbset: \tcbset{lang, title={#2} }% \tcblisting{} }{ \endtcblisting \group_end: } \NewDocumentEnvironment{ codebox* }{O{} m } { \group_begin: \bool_set_false:N \l__codebox_comment_bool \keys_set:nn { codebox } { #1 } \__codebox_code_engine_tcbset: \__codebox_comment_tcbset: \tcbset{lang, title={#2} }% \tcblisting{} }{ \endtcblisting \group_end: } \NewDocumentCommand \codefile { s O{} m m } { \group_begin: \IfBooleanTF{#1} { \bool_set_true:N \l__codebox_comment_bool }{ \bool_set_false:N \l__codebox_comment_bool } \keys_set:nn { codebox } { #2 } \__codebox_code_engine_tcbset: \__codebox_comment_tcbset: \tcbset{ lang, title={#3}, listing~file={#4}, }% \tcbinputlisting{ } \group_end: } \__codebox_set_counter_parent: \DeclareTCBListing[use~counter=cvcounter]{codeviewaux}{m} { title={\tl_use:N \l__codebox_code_name_tl\nobreakspace\thecvcounter\nobreakspace~#1}, } \NewDocumentEnvironment{ codeview }{O{} m } { \group_begin: \bool_set_false:N \l__codebox_comment_bool \keys_set:nn { codebox } { #1 } \__codebox_code_engine_tcbset: \__codebox_comment_tcbset: \tl_if_empty:NF \l__codebox_label_name_tl { \tcbset{ label=\tl_use:N \l__codebox_label_name_tl, } } \tcbset{ cv, overlay~unbroken~and~first ={ \begin{tcbclipinterior} \node[inner~sep=0pt,anchor=north~east,yshift=-3pt,xshift=-5pt,text=cvgrayb] at (frame.north~east){ \ttfamily\faFile*\ \faCode\ \faCodeBranch\ \faCopy\ \faExternalLink*\ \MakeUppercase{\tl_use:N \l__codebox_language_tl} }; \end{tcbclipinterior} } }% \codeviewaux{#2} }{ \endcodeviewaux \group_end: } \NewDocumentEnvironment{ codeview* }{O{} m } { \group_begin: \bool_set_true:N \l__codebox_comment_bool \keys_set:nn { codebox } { #1 } \__codebox_code_engine_tcbset: \__codebox_comment_tcbset: \tl_if_empty:NF \l__codebox_label_name_tl { \tcbset{ label=\tl_use:N \l__codebox_label_name_tl, } } \tcbset{ cv, overlay~unbroken~and~first ={ \begin{tcbclipinterior} \node[inner~sep=0pt,anchor=north~east,yshift=-3pt,xshift=-5pt,text=cvgrayb] at (frame.north~east){ \ttfamily\faFile*\ \faCode\ \faCodeBranch\ \faCopy\ \faExternalLink*\ \MakeUppercase{\tl_use:N \l__codebox_language_tl} }; \end{tcbclipinterior} } }% \codeviewaux{#2} }{ \endcodeviewaux \group_end: } \DeclareTCBInputListing[use~counter=cvcounter]{\langfileaux}{m} { title={\tl_use:N \l__codebox_code_name_tl\nobreakspace\thecvcounter\nobreakspace~#1}, } \NewDocumentCommand \cvfile { s O{} m m } { \group_begin: \IfBooleanTF{#1} { \bool_set_true:N \l__codebox_comment_bool }{ \bool_set_false:N \l__codebox_comment_bool } \keys_set:nn { codebox } { #2 } \__codebox_code_engine_tcbset: \__codebox_comment_tcbset: \tl_if_empty:NF \l__codebox_label_name_tl { \tcbset{ label=\tl_use:N \l__codebox_label_name_tl, } } \tcbset{ cv, listing~file={#4}, overlay~unbroken~and~first ={ \begin{tcbclipinterior} \node[inner~sep=0pt,anchor=north~east,yshift=-3pt,xshift=-5pt,text=cvgrayb] at (frame.north~east){ \ttfamily\faFile*\ \faCode\ \faCodeBranch\ \faCopy\ \faExternalLink*\ \MakeUppercase{\tl_use:N \l__codebox_language_tl} }; \end{tcbclipinterior} } }% \langfileaux{#3} \group_end: } %% %% This package consists of the file codebox.dtx, %% and the derived files codebox.sty, %% codebox.pdf, %% codebox.ins, %% README.md. %% %% End of file `codebox.sty'.