Officedown: Закладка \@ref не работает для многобайтовых строк

Созданный на 27 авг. 2020  ·  7Комментарии  ·  Источник: davidgohel/officedown

Предположим, у меня есть файл .Rmd, как показано ниже:

---
title: "Untitled"
output:
  officedown::rdocx_document:
    default
---
```{r setup, include=FALSE}
knitr::opts_chunk$set(echo = TRUE)



md5-4caffc4710057148fdad652000287a10



# Chapter1 {#ch1}

# Chapter2 {#ch2}

Refer to \@ref(ch1).

Когда \@ref (ch1) окружен многобайтовыми строками (например, китайскими иероглифами), могут возникнуть ошибки.

  • Чистый мультибайт + ссылка

    • Пример: 上下\@ref(ch1)
    • Результат: правильный
  • Смешанный многобайтовый/однобайтовый + ссылка

    • Пример: 上a下\@ref(ch1)
    • Результат: неверный (上a下@ref (ch1))
  • ссылка + мультибайт

    • Пример: \@ref(ch1)。
    • Результат: компиляция не удалась


    Ошибка в nchar(u, itype): недопустимая многобайтовая строка, элемент 1

    Звонки:... regmatches<- -> regmatches -> Map -> mapply ->



Не могли бы вы разобраться в этом вопросе? Спасибо.


информация о сеансе()

R версия 4.0.2 (2020-06-22)
Платформа: x86_64-w64-mingw32/x64 (64-разрядная версия)
Работает под: Windows 10 x64 (сборка 20180)

Матричные продукты: по умолчанию

локаль:
[1] LC_COLLATE=Китайский (упрощенный)_Китай.936
[2] LC_CTYPE=Китайский (упрощенный)_Китай.936
[3] LC_MONETARY=Китайский (упрощенный)_Китай.936
[4] LC_NUMERIC=С
[5] LC_TIME=Китайский (упрощенный)_Китай.936

прилагаемые базовые пакеты:
[1] Графика статистики grDevices использует методы наборов данных
[7] база

другие прилагаемые пакеты:
[1] Officer_0.3.12 officedown_0.2.0 flextable_0.5.10
[4] ggplot2_3.3.2 tidyr_1.1.1 knitr_1.29
[7] dplyr_1.0.2 сетчатый_1.16

загружается через пространство имен (и не прикрепляется):
[1] Rcpp_1.0.5решетка_0.20-41красивыеединицы_1.1.1
[4] sysfonts_0.8.1 ps_1.3.4 utf8_1.1.4
[7] rprojroot_1.3-2 assertthat_0.2.1 дайджест_0.6.25
[10] R6_2.4.1 бэкпорты_1.1.9 оценка_0.14
[13] столб_1.4.6 gdtools_0.2.2 rlang_0.4.7
[16] curl_4.3 uuid_0.1-4 data.table_1.13.0
[19] callr_3.4.3 Matrix_1.2-18 rmarkdown_2.3
[22] desc_1.2.0 labeling_0.3 devtools_2.3.1
[25] stringr_1.4.0 munsell_0.5.0 tinytex_0.25
[28] компилятор_4.0.2 xfun_0.16 pkgconfig_2.0.3
[31] systemfonts_0.2.3 base64enc_0.1-3 pkgbuild_1.1.0
[34] rvg_0.2.5 htmltools_0.5.0 tidyselect_1.1.0
[37] tibble_3.0.3 bookdown_0.20 fansi_0.4.1
[40] crayon_1.3.4 showtextdb_3.0 withr_2.2.0
[43] grid_4.0.2 jsonlite_1.7.0 gtable_0.3.0
[46] жизненный цикл_0.2.0 магриттр_1.5 весы_1.1.1
[49] zip_2.1.0 cli_2.0.2 stringi_1.4.6
[52] farver_2.0.3 fs_1.5.0 remotes_2.2.0
[55] testthat_2.3.2 xml2_1.3.2 многоточие_0.3.1
[58] generics_0.0.2 vctrs_0.3.2 tools_4.0.2
[61] showtext_0.9 клей_1.4.1 муррр_0.3.4
[64] processx_3.4.3 pkgload_1.1.0 yaml_2.2.1
[67] colorspace_1.4-1 sessioninfo_1.1.1 memoise_1.1.0
[70] использовать это_1.6.1

Все 7 Комментарий

```````


Название: "Без названия"
вывод:
officedown::rdocx_document:

дефолт

{r setup, include=FALSE} knitr::opts_chunk$set(echo = TRUE)

Глава 1 {# ch1}

глава 2 {# ch2}

См. @ref (ch1).

Когда @ref (ch1) окружен многобайтовыми строками (например, китайскими иероглифами), могут возникнуть ошибки.

  • Чистый мультибайт + ссылка:上下@ref (ch1)
  • Пример:上a下@ref (ch1)
  • ссылка + мультибайт: @ref (ch1)。
    ```````

Ваша проблема связана с тем, что вы не работаете с файлом в кодировке UTF-8.

R, R Markdown и Windows плохо работают, если кодировка не UTF-8.

Capture d’écran 2020-08-27 à 10 53 27

Без названия.docx

Да, @davidgohel , ты прав. Хотя файл .Rmd находится в кодировке UTF-8, ОС работает в кодировке GBK. Когда я перехожу на bookdown::word_document2 , движку Knitr удается скомпилировать файл. Но я все еще получаю ?? где должна появиться закладка.

Вам не нужно пробовать новые функции формата вывода.

Показанный ниже результат получен в Windows с французским языком. Но я убедился, что файл был закодирован как UTF-8 (я использую readr::guess_encoding() , если кодировка не UTF-8, я могу изменить ее на UTF8 с помощью fpeek::peek_iconv() ).

Не могли бы вы показать результат

readr::guess_encoding("your/rmd/file")

Результаты

нет | кодирование | уверенность
---|-------------|-----------:
1 | UTF-8 | 1
2 | окна-1252 | 0,28

Привет @madlogos ,

Я также являюсь китайским пользователем. Проблема многобайтности меня тоже давно беспокоила. Вот мой трюк для этого:

  1. Напишите @ref как обычно;
  2. Сохраните файл Rmd и readr::read_lines его;
  3. Сопоставьте строки, содержащие шаблон "\\\\@ref\\([^\\)]+\\)" ;
  4. Разделите его и убедитесь, что "\\\\@ref\\([^\\)]+\\)" в одной строке;
  5. Сохраните вектор символов в новый файл Rmd и визуализируйте его в нужном вам формате. Сделанный!

Например, 请参考表\@ref(tab: coco)中的数据 следует разделить как
[строка 1] 请参考表
[строка 2] \@ref(tab: coco)
[строка 3] 中的数据

Ну, я не уверен, что это эффективное решение, но оно работает для меня. 😄

@bishun945 спасибо за обращение. Хорошая вещь.

@madlogos Я пробовал другое решение: просто переключите вашу систему и язык MS Word на английский.

Была ли эта страница полезной?
0 / 5 - 0 рейтинги