<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все отступы и размеры соседних элементов.