在与官员遇到类似问题并查看源代码后,我想出了以下解决方案
ph_with_text_fld(doc, type = "sldNum", str = "2")
该函数的代码如下:
library(htmltools)
library(xml2)
ph_with_text_fld <- function( x, str, type = "title", index = 1 ){
stopifnot( type %in% c("ctrTitle", "subTitle", "dt", "ftr", "sldNum", "title", "body") )
slide <- x$slide$get_slide(x$cursor)
sh_pr_df <- slide$get_xfrm(type = type, index = index)
sh_pr_df$str <- str
xml_elt <- do.call(pml_shape_str_fld, sh_pr_df)
node <- as_xml_document(xml_elt)
xml_add_child(xml_find_first(slide$get(), "//p:spTree"), node)
slide$fortify_id()
x
}
pml_shape_str_fld <- function(str, ph, offx, offy, cx, cy, ...) {
sp_pr <- sprintf("<p:spPr><a:xfrm><a:off x=\"%.0f\" y=\"%.0f\"/><a:ext cx=\"%.0f\" cy=\"%.0f\"/></a:xfrm></p:spPr>", offx, offy, cx, cy)
# sp_pr <- "<p:spPr/>"
nv_sp_pr <- "<p:nvSpPr><p:cNvPr id=\"\" name=\"\"/><p:cNvSpPr><a:spLocks noGrp=\"1\"/></p:cNvSpPr><p:nvPr>%s</p:nvPr></p:nvSpPr>"
nv_sp_pr <- sprintf( nv_sp_pr, ifelse(!is.na(ph), ph, "") )
paste0( pml_with_ns("p:sp"),
nv_sp_pr, sp_pr,
"<p:txBody><a:bodyPr/><a:lstStyle/><a:p><a:fld id=\"{GUID FROM THE MASTER TEMPLATE}\" type=\"slidenum\"><a:rPr/><a:t>",
htmlEscape(str),
"</a:t></a:fld></a:p></p:txBody></p:sp>"
)
}
pml_with_ns <- function(x){
base_ns <- "xmlns:a=\"http://schemas.openxmlformats.org/drawingml/2006/main\" xmlns:r=\"http://schemas.openxmlformats.org/officeDocument/2006/relationships\" xmlns:p=\"http://schemas.openxmlformats.org/presentationml/2006/main\""
sprintf("<%s %s>", x, base_ns)
}
重要的部分是
<a:fld id=\"{GUID FROM THE MASTER TEMPLATE}\" type=\"slidenum\">
其中来自主模板的 GUID 需要替换为该字段的幻灯片母版布局中的 GUID