Hi, welcome to the Typst forum!
The #set enum(tight: false) is only changing the default value of tight. This has an effect when you call #enum(...) without a tight argument. But writing a list in markup like
+ a
+ b
is equivalent to calling enum() with a tight argument that depends on the spacing between the markup items. So for markup lists, the tight argument is set and the default is not used.
This is the case even if you have a single item: in this case there’s no empty line between markup items, so it’s a tight list.
If you really want to, you can add a show rule to convert any tight list to non-tight:
#show enum.where(tight: true): it => {
let (children, ..parameters) = it.fields()
enum(..children, ..parameters, tight: false)
}
But your problem is not really about tight vs non-tight: you have a show rule on paragraphs, and you’re having this problem because tight list items don’t always make a paragraph. You can fix this manually in markup:
+ single item #parbreak() // adding parbreak to force a paragraph
or you can write a show rule to do that automatically:
#show enum.item: it => {
let (number, body, ..parameters) = it.fields()
if body.children.last() == parbreak() {
return it
}
return enum.item(number, body + parbreak(), ..parameters)
}
However I’m not sure the whole thing with the par show rule is the right approach. It’s probably better to set the margins as you want for the text, and use show rules for tables, figures, etc. to make them wider than the text area. Or even better, use custom functions instead of global show rules, so that you control exactly which elements are wide:
#set page(margin: (left: 1in, right: 1in + 3in))
#lorem(20)
+ #lorem(20)
#let wide-element(it) = block(width: 100% + 3in, it)
#wide-element[Some wide text... #lorem(30)]
#wide-element(rect(width: 100%))
