The name idwtet
stands for "I Don't Wanna Type Everything Twice". It provides a typst-ex
and a typst-ex-code
codeblock, which shows and executes typst code.
It is meant for code demonstration, e.g. when publishing a package, and provides some niceties:
- the code should always be correct in the examples: As the example code is used for the code block, but also for evaluation, there is no need to write it twice
- easy configuration with simple, uniform and good look
However, there are some limitations:
- Every code block has its own local scope and the default behaviour is that variables are not reachable from outside. A similar restriction lies on import statements. That is why, there is the
eval-scope
argument, which captures variables and simulates global variables. Additionally, atypst
codeblock is provided for a consistent look. - Locality can be displayed to the users by automatically wrapping code in
typst-ex-code
, buttypst-ex
does not provide such functionality. It might thus be difficult for users to understand code examples this way. - The page width has to be defined in absolute terms. It is quite nice, for a showcase, to take the least possible space, but tracking the widths of all boxes and then setting the page width accordingly is not (yet) possible.
Only one function is defined,
init(body, bcolor: luma(210), inset: 5pt, border: 2pt, radius: 2pt, content-font: "linux libertine", code-font-size: 9pt, content-font-size: 11pt, code-return-box: true, wrap-code: false, eval-scope: (:), escape-bracket: "%")
,
which is supposed to be used with a show rule.
Then raw codeblocks (with block=true
) of the languages typst
, typst-ex
, typst-code
and typst-ex-code
are modified. The main feature of this package are typst-ex
and typst-ex-code
. The typst
and typst-code
blocks do not evaluate anything, but their design fits that of the others.
The parameters of init
are:
body
: for usage with show rule, hence the whole document.bcolor
: the background- (and border-) color of the blocksinset
: inset param of code and content blocks, should be ≥ 2ptborder
: border thicknessradius
: block radiuscontent-font
: The font used in the previewed content / result.code-font-size
: The fontsize used in the code blocks.content-font-size
: The fontsize used in the preview content / result.code-return-box
: If to show the code return type ontypst-ex-code
blocks.wrap-code
: If to wrap the code in#{
and}
, to symbolize local scope.eval-scope
: A dictionary with the keys as the variable names and the values as another dictionary with keysvalue
andcode
, both of these are optional. The former has the defined value, the latter the code recreate the variable, for usage in the code blocks.escape-bracket
: The text to wrap a variable with, to access thecode
part of aeval-scope
variable.
There are currently two methods to change the code:
- use the
eval-scope
argument from theinit
function. There is acode
field in the dictionaries, which enables the usage of the key escaped inescape-bracket
to be replaced in the codeblock code half and to be removed in the codeblock result half, as the value is given via scope. Take a look at the example below, where%ouset%
is used this way. - use the
ENDHIDDEN
feature. When escaped inescape-bracket
, everything above the statement is removed from the codeblock code half BUT everything (without theENDHIDDEN
statement) is evaluated. Take a look at the example in the examples folder.
#set page(margin: 0.5cm, width: 14cm, height: auto)
#import "@preview/idwtet:0.1.0"
#show: idwtet.init.with(eval-scope: (
ouset: (
value: {import "@preview/ouset:0.1.1": ouset; ouset},
code: "#import \"@preview/ouset:0.1.1\": ouset"
)
))
== ouset package #text(gray)[(v0.1.1)]
```typst-ex
%ouset%
$
"Expression 1" ouset(&, <==>, "Theorem 1") "Expression 2"\
ouset(&, ==>,, "Theorem 7") "Expression 3"
$
```
Or something like
```typst-ex-code
let a = range(10)
a
```
Further examples are given in the repo example folder.