<style>html, body { margin: 0; padding: 0; } ol { --main-max-width: 50em; --main-padding: 1em; max-width: var(--main-max-width); margin: 0 auto; padding: var(--main-padding); list-style: none; background: whitesmoke; } ol li { white-space: pre-wrap; tab-size: min( /* выбирается то, которое меньше */ calc(100vw - 2ch - var(--main-padding) * 2 - 17px), /* область просмотра за минусом ширины двух цифр, ширины отступа и 17px полосы прокрутки */ calc(var(--main-max-width) - 2ch) /* максимальная ширина блока за минусом ширины двух цифр */ ); } ol span { border-bottom: 1px dotted #999; } </style> <ol> <li>ЧАСТЬ ПЕРВАЯ <span>	</span>3 <li>Глава 1. Никогда не разговаривайте с неизвестными <span>	</span>5 <li>Глава 2. Понтий Пилат <span>	</span>21 <li>Глава 3. Седьмое доказательство <span>	</span>52 <li>Глава 4. Погоня <span>	</span>58 <li>Глава 5. Было дело в Грибоедове <span>	</span>67 </ol>
Символ табуляции 	
растягивается на необходимое расстояние. Его ширина задана свойством tab-size
.
Минусы варианта:
- на разных устройствах может быть разная ширина полосы прокрутки,
- неудобно вычитать из
100vw
все отступы и размеры соседних элементов.