Теги, подытоги и статистика
Строки-теги, секции-разделители, подытоги, общие итоги, агрегаты по тегам, статистика, динамические случайные значения и настраиваемая статистика футера.
Теги и подытоги добавляют поверх блокнота структуру из обычного текста. Завершающий #tag
помечает строку, точный разделитель --- начинает новую секцию, subtotal суммирует
текущую секцию, grand total суммирует успешные подытоги, а агрегаты по тегам отвечают
на total of #tag и подобные запросы. Четыре функции — count, median, stdev
и rand — включены в приложение, а плавающий Total можно переключить на Sum, Average, Count
или Median. Всё строго: почти-попадание остаётся обычной строкой, а агрегаты никогда не
переиспользуют производные строки.
Заголовки, теги и разделители
- Заголовок — строка, начинающаяся ровно с
#(решётка и один пробел).#food— не заголовок, а строка-тег. - Тег — завершающий атом:
#без пробела, далее идентификатор, начинающийся с буквы (буквы, цифры,_,-; до 64 графем). В конце строки может быть несколько тегов; дубликаты на одной строке схлопываются (побеждает первое написание). Регистр и NFC нормализуются для поиска, исходное написание сохраняется, поэтому декомпозированное#cafe\u0301— валидный тег и находит тот же агрегат, что и#café. Теги никогда не меняют ответ строки и не распознаются в середине выражения (2 #food + 3— это арифметика). Комментарии и заголовки тегов не объявляют. - Разделитель — строка, целиком равная
---(внешние пробелы допустимы). У него нет ответа, он никогда не входит в сумму и начинает новую секцию тегов.----и более длинные серии дефисов — обычные строки.
2 + 3 #math #cash → 5, tagged math and cash
5 #a
total of #a → 5
Секции, подытоги и общий итог
Старая команда total продолжает работать, а границей для неё теперь служат заголовок
# , точный разделитель --- или ближайший total. Доступны также:
subtotal— суммирует eligible-строки с момента последнего подытога, заголовка или разделителя.subtotal + 15%/subtotal - 15%— процент применяется к «сырому» подытогу (100→115).<name> = subtotal[ ± 15%]— именованная форма, записывающая значение в окружение как обычный скаляр (sum = subtotal + 15%→115).grand total(и<name> = grand total) — суммирует только успешно вычисленные строки-подытоги выше; разделитель не стирает список. Провалившийся или переполнившийся подытог никогда не входит в сумму.
grand total требует минимум два успешных подытога; при меньшем числе строка становится
тихой общей ошибкой Invalid expression, и ничего не угадывается.
total last N — сумма по последним строкам
total суммирует все подходящие строки своей секции. Ограниченная форма
total last N суммирует только подходящие значения из N непосредственно
предшествующих логических строк той же секции, после чего сбрасывает секцию
ровно так же, как обычный total.
N— целое положительное число. После внешних пробелов или табов строка должна читаться какtotal last N(регистр не важен, части могут разделяться одним или несколькими пробелами либо табами).total last 0,total last -3,total last 3.5, отсутствующее число, лишние слова или слишком большое число — обычные строки, а не команды.Nсчитает логические строки, а не результаты. Пустая строка, комментарий, проза, ошибка, строки денег и единиц, одиночный токен ответа и производные строки (подытоги, общий итог, агрегаты по тегам) занимают ровно по одному слоту и ничего не добавляют. Собственная строка команды никогда не входит в свои слоты.- Граница секции не меняется. Окно никогда не заглядывает выше ближайшего
total/total last N, заголовка#или точного разделителя---.subtotalиgrand totalне являются границами старого total, но их собственные строки всё равно занимают слоты. - Правила отбора не меняются. Действуют те же правила, что и для обычного
total: конечные безразмерные скаляры, точные целые и строки использования именованных скаляров учитываются; объявления, деньги, величины с единицами, логические значения, даты и ошибки — нет. - Окно больше секции суммирует то, что есть (пустая секция даёт
0), и команда сбрасывает секцию после ответа — поэтому следующийtotalилиtotal last Nначинается с пустой секции. - Переполнение и динамические значения оцениваются по окну. Тихая ошибка
Invalid expressionпоявляется, только если переполнилась сумма выбранных строк; переполнение выше окна на неё не влияет. Строка динамическая (зависит отrand) только тогда, когда динамическим оказался выбранный подходящий вклад. - Затенение общее: активная переменная или константа с именем
totalотключает обе формы, как и раньше.
10
20
30
total last 2 → 30 (the blank line took a slot and added nothing)
40
50
total last 3 → 90 (only 40 and 50 were in the window)
total → 0 (the section was already reset)
10
20
subtotal → 30
10
subtotal
20
subtotal
grand total → 30
Заголовок или разделитель сбрасывает аккумулятор подытога:
10
# Section
20
subtotal → 20
Строка старого total не является границей для подытога; она исключается из подытога как
производная строка, но собственная секция старого total по-прежнему охватывает строку
подытога.
Какие строки подходят
Подходят конечные безразмерные скаляры (обычные числа, дроби, проценты, множители),
точные целые и строки, использующие именованные скаляры. Не подходят: объявления
(x = …), строки из одного токена, деньги, величины с единицами, логические/датовые/
временные/гео-значения, ошибки, разделители и все производные строки. Токен внутри
настоящего выражения считается; строка только из токена — нет.
x = 5
x + 5
$7
3 kg
true
50%
1/4
0xFF
2 + 3
subtotal → 270.75
Добавление структурных строк
- File → Add Subtotal (
⌘T) и File → Add Grand Total (⌘⇧T) вставляют команду в строку каретки. Они срабатывают только когда целевая строка пуста (пробельная) или является строгим пустым<name> =(пробелы в конце допустимы); на любом другом содержимом — сигнал и никаких изменений.⌘⇧Tдополнительно требует как минимум два успешных подытога выше. - Двойной клик по пустой строке ответа (пробельной или строгому
<name> =) вставляетsubtotalчерез тот же планировщик. Заголовки, комментарии, разделители, строки-теги, проза и ошибки остаются инертными. - Convert to Normal Line в контекстном меню строки подытога/общего итога заменяет
команду на локально перенабираемый числовой литерал полной точности отображённого
значения; именованная форма сохраняет префикс
<name> =, а число строк и стабильные идентификаторы не меняются.
Агрегаты по тегам
total of #tag, average of #tag, count of #tag и median of #tag (регистр не важен;
ровно один тег в запросе) видят только подходящие строки с этим тегом строго выше
себя в текущей секции — разделитель закрывает секцию. Строка с несколькими тегами входит
в каждый тег по разу. Пустое множество даёт 0 для total/count и тихую ошибку для
average/median. Производные агрегатные строки никогда не питают последующие агрегаты,
подытог или футер.
Статистические функции и естественные фразы
count, median и выборочный stdev (n−1) входят в 27 встроенных функций, а rand
даёт включительные случайные целые. Каждая функция следует общим правилам вызова: имена
без учёта регистра, аргументы — полные выражения, строгие ошибки арности и области.
count(1, 2, 3)→ 3median(1, 2, 3)→ 2median(1, 2, 3, 4)→ 2.5stdev(2, 4, 4, 4, 5, 5, 7, 9)→ ≈ 2.13809 (выборочное, n−1)rand(1, 6)→ равномерное целое в1…6
Естественные фразы покрывают то же: median of 1, 2, 3 → 2,
count of 1, 2, 3, 4 → 4, standard deviation of 2, 4, 4, 4, 5, 5, 7, 9 и
random number between X and Y. Список использует активный разделитель аргументов
(, в точечных форматах, ; в запятых), поэтому median of 1,5; 2,5; 3,5 → 2.5 в
запятом формате. Результаты следуют десятичным знакам листа. Медиана и среднее устойчивы
к переполнению, поэтому конечные экстремальные значения не
дают бесконечность.
Динамические случайные значения
Строка становится динамической, когда rand реально выполнился (пробел и регистр перед ( не важны) или когда она читает динамическое имя.
Незапущенная ветка if, комментарии и невалидный текст динамическими не становятся.
Зависимость распространяется через именованные значения, subtotal, grand total и
агрегаты по тегам; вид строки сохраняется (подытог остаётся подытогом).
Динамическое значение остаётся стабильным, пока вы не измените лист или не нажмёте ⌘R
(Recalculate Dynamic Values); прокрутка, наведение, смена формата и меню футера не
перерисовывают его. Оно никогда не
токенизируется и не входит в цепочку Previous Answer. Экспорт PDF фиксирует текущее
значение.
Статистика футера
Правый клик по плавающему Total открывает выбор Sum, Average, Count или
Median в одном нативном меню с отметкой. Выбор — глобальная для приложения
сохраняемая настройка (никогда не часть .nlx), и он меняет только футер — никогда
содержимое листа, каретку, выделение, IME, прокрутку или редактор. Count показывает
точное целое; остальные статистики используют глобальное представление чисел. Панель
использует те же канонические подходящие строки, что и итоги выше: производные агрегатные
строки (inline-итоги, подытоги, общие итоги, агрегаты по тегам, разделители) никогда не
входят, а значение по умолчанию Sum совпадает с прежним Total.
Неизвестное значение падает обратно в Sum.
Токены, экспорт и взаимодействие с итогами
- Конечная строка агрегата по тегу или подытога — обычное число для Answer Tokens; тот же результат никогда не переиспользуется последующим агрегатом, подытогом или футером.
- Округление и переопределения формата отдельных ответов никогда не меняют статистику футера; она следует глобальной нотации и региональным настройкам.
- Экспорт PDF и печать сохраняют производные строки помеченными как производные, поэтому экспортированная страница никогда не считает их дважды, а экспорт фиксирует текущее случайное значение.
Связанные разделы
- Встроенные функции — полный список функций и строгие правила вызова.
- Язык листа — формы строк и старая команда
total. - Экспорт и печать — как производные строки и статистика футера выглядят в PDF.